Skip to content

Commit 2681876

Browse files
committed
Add option for flutter dap
1 parent 7d224ba commit 2681876

File tree

2 files changed

+101
-19
lines changed

2 files changed

+101
-19
lines changed

lsp-dart-dap.el

Lines changed: 79 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,28 @@
4242
:group 'lsp-dart
4343
:type 'string)
4444

45-
(defcustom lsp-dart-dap-debugger-program
45+
(defcustom lsp-dart-dap-dart-debugger-program
4646
`("node" ,(f-join lsp-dart-dap-debugger-path "extension/out/src/debug/dart_debug_entry.js"))
4747
"The path to the dart debugger."
4848
:group 'lsp-dart
4949
:type '(repeat string))
5050

51+
(defcustom lsp-dart-dap-flutter-debugger-program
52+
`("node" ,(f-join lsp-dart-dap-debugger-path "extension/out/src/debug/flutter_debug_entry.js"))
53+
"The path to the Flutter debugger."
54+
:group 'lsp-dart
55+
:type '(repeat string))
56+
57+
(defcustom lsp-dart-dap-debug-external-libraries nil
58+
"If non-nil, enable the debug on external libraries."
59+
:group 'lsp-dart
60+
:type 'boolean)
61+
62+
(defcustom lsp-dart-dap-debug-sdk-libraries nil
63+
"If non-nil, enable the debug on Dart SDK libraries."
64+
:group 'lsp-dart
65+
:type 'boolean)
66+
5167
(defcustom lsp-dart-dap-devtools-theme "dark"
5268
"The theme to Dart DevTools."
5369
:group 'lsp-dart
@@ -58,11 +74,26 @@
5874
:group 'lsp-dart
5975
:type 'string)
6076

77+
(defcustom lsp-dart-dap-flutter-track-widget-creation t
78+
"Whether to pass –track-widget-creation to Flutter apps.
79+
Required to support 'Inspect Widget'."
80+
:group 'lsp-dart
81+
:type 'string)
82+
83+
(defcustom lsp-dart-dap-flutter-structured-errors t
84+
"Whether to use Flutter's structured error support for improve error display."
85+
:group 'lsp-dart
86+
:type 'string)
87+
88+
89+
90+
;;; Internal
91+
6192
(defconst lsp-dart-dap--devtools-buffer-name "*LSP Dart - DevTools*")
6293
(defconst lsp-dart-dap--pub-list-pacakges-buffer-name "*LSP Dart - Pub list packages*")
6394

6495
(defun lsp-dart-dap--setup-extension ()
65-
"Setup dart debugger extension to run `lsp-dart-dap-debugger-program`."
96+
"Setup dart debugger extension to run `lsp-dart-dap-dart-debugger-program`."
6697
(lsp-dart-project-log "Setting up DAP...")
6798
(lsp-async-start-process
6899
(lambda ()
@@ -83,26 +114,56 @@
83114
lsp-dart-dap-debugger-path
84115
#'lsp-dart-dap--setup-extension)
85116

86-
(defun lsp-dart-dap--populate-start-file-args (conf)
87-
"Populate CONF with the required arguments."
117+
(defun lsp-dart-dap--populate-dart-start-file-args (conf)
118+
"Populate CONF with the required arguments for dart debug."
88119
(-> conf
89-
(dap--put-if-absent :dap-server-path lsp-dart-dap-debugger-program)
90-
(dap--put-if-absent :type "dart")
120+
(dap--put-if-absent :dap-server-path lsp-dart-dap-dart-debugger-program)
91121
(dap--put-if-absent :cwd (lsp-dart-project-get-root))
92122
(dap--put-if-absent :program (buffer-file-name))
93-
(dap--put-if-absent :name "Dart Debug")
94123
(dap--put-if-absent :dartPath (lsp-dart-project-dart-command))
95-
(dap--put-if-absent :debuggerType 0)
96-
(dap--put-if-absent :debugExternalLibraries nil)
97-
(dap--put-if-absent :debugSdkLibraries nil)))
124+
(dap--put-if-absent :debugExternalLibraries lsp-dart-dap-debug-external-libraries)
125+
(dap--put-if-absent :debugSdkLibraries lsp-dart-dap-debug-sdk-libraries)))
98126

99-
(dap-register-debug-provider "dart" 'lsp-dart-dap--populate-start-file-args)
100-
(dap-register-debug-template "Dart :: Run Configuration"
127+
(dap-register-debug-provider "dart" 'lsp-dart-dap--populate-dart-start-file-args)
128+
(dap-register-debug-template "Dart :: Debug"
101129
(list :type "dart"
102-
:cwd nil
103130
:request "launch"
104-
:program nil
105-
:name "Dart::Run"))
131+
:name "Dart"))
132+
133+
;; Flutter
134+
135+
(defun lsp-dart-dap--flutter-get-or-create-device ()
136+
"Return the device to debug or prompt to start it."
137+
(ht ('id "emulator-5554")
138+
('name "device")))
139+
140+
(defun lsp-dart-dap--populate-flutter-start-file-args (conf)
141+
"Populate CONF with the required arguments for Flutter debug."
142+
(-let* ((root (lsp-dart-project-get-root))
143+
((&hash "id" device-id "name" device-name) (lsp-dart-dap--flutter-get-or-create-device)))
144+
(-> conf
145+
(dap--put-if-absent :dap-server-path lsp-dart-dap-flutter-debugger-program)
146+
(dap--put-if-absent :cwd root)
147+
(dap--put-if-absent :program (lsp-dart-project-get-entrypoint))
148+
(dap--put-if-absent :dartPath (lsp-dart-project-dart-command))
149+
(dap--put-if-absent :flutterPath (lsp-dart-project-get-flutter-path))
150+
(dap--put-if-absent :flutterTrackWidgetCreation lsp-dart-dap-flutter-track-widget-creation)
151+
(dap--put-if-absent :useFlutterStructuredErrors lsp-dart-dap-flutter-structured-errors)
152+
(dap--put-if-absent :debugExternalLibraries lsp-dart-dap-debug-external-libraries)
153+
(dap--put-if-absent :debugSdkLibraries lsp-dart-dap-debug-sdk-libraries)
154+
(dap--put-if-absent :deviceId device-id)
155+
(dap--put-if-absent :deviceName device-name)
156+
(dap--put-if-absent :name (concat "Flutter (" device-name ")")))))
157+
158+
(dap-register-debug-provider "flutter" 'lsp-dart-dap--populate-flutter-start-file-args)
159+
(dap-register-debug-template "Flutter :: Debug"
160+
(list :type "flutter"
161+
:request "launch"
162+
:flutterMode "debug"
163+
:flutterPlatform "default"
164+
:name "Flutter"))
165+
166+
;; DevTools
106167

107168
(cl-defmethod dap-handle-event ((_event (eql dart.debuggerUris)) _session params)
108169
"Handle debugger uris EVENT for SESSION with PARAMS."
@@ -202,6 +263,9 @@ If it is already activated or after activated successfully, call CALLBACK."
202263
(url (concat "http://" uri "?" params)))
203264
(browse-url url)))
204265

266+
267+
;;; Public interface
268+
205269
;;;###autoload
206270
(defun lsp-dart-dap-open-devtools ()
207271
"Open Dart DevTools for the current debug session."

lsp-dart-project.el

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,19 @@ in the PATH env."
3939
:group 'lsp-dart
4040
:type 'string)
4141

42+
(defun lsp-dart-project-get-flutter-path ()
43+
"Return the Flutter SDK path."
44+
(-> lsp-dart-project-flutter-command
45+
executable-find
46+
file-truename))
47+
4248
(defun lsp-dart-project-get-sdk-dir ()
4349
"Return the dart sdk.
4450
Check for `lsp-dart-project-sdk-dir` otherwise search for dart executable or
4551
flutter cache dir."
4652
(or lsp-dart-project-sdk-dir
4753
(-when-let (dart (or (executable-find "dart")
48-
(-when-let (flutter (-> lsp-dart-project-flutter-command
49-
executable-find
50-
file-truename))
54+
(-when-let (flutter (lsp-dart-project-get-flutter-path))
5155
(expand-file-name "cache/dart-sdk/bin/dart"
5256
(file-name-directory flutter)))))
5357
(-> dart
@@ -66,7 +70,21 @@ flutter cache dir."
6670

6771
(defun lsp-dart-project-get-root ()
6872
"Return the dart or flutter project root."
69-
(file-truename (locate-dominating-file default-directory "pubspec.yaml")))
73+
(-some-> default-directory
74+
(locate-dominating-file "pubspec.yaml")
75+
file-truename))
76+
77+
(defun lsp-dart-project-get-entrypoint ()
78+
"Return the dart or flutter project entrypoint."
79+
(let* ((root (lsp-dart-project-get-root))
80+
(lib-entry (expand-file-name "lib/main.dart" root))
81+
(bin-entry (expand-file-name "bin/main.dart" root)))
82+
(cond
83+
((file-exists-p lib-entry)
84+
lib-entry)
85+
86+
((file-exists-p bin-entry)
87+
bin-entry))))
7088

7189
(defun lsp-dart-project-log (msg &rest args)
7290
"Log MSG with ARGS and custom prefix."

0 commit comments

Comments
 (0)