@@ -48,6 +48,10 @@ defmodule ComponentsGuide.Research.Sources.Typescript do
4848 defstruct name: nil , doc: nil , line_start: nil , line_end: nil
4949 end
5050
51+ defmodule Type do
52+ defstruct name: nil , doc: nil , line_start: nil , line_end: nil
53+ end
54+
5155 defmodule Namespace do
5256 defstruct name: nil , doc: nil , line_start: nil , line_end: nil
5357 end
@@ -114,11 +118,86 @@ defmodule ComponentsGuide.Research.Sources.Typescript do
114118
115119 def do_reduce ( { "interface " <> name_and_extends , n } , % State { mode: nil } = state ) do
116120 name = extract_name ( name_and_extends )
121+ { doc , line_start } = read_prev_doc ( state , n )
122+
123+ case name_and_extends |> String . trim_trailing ( ) |> String . ends_with? ( "}" ) do
124+ true ->
125+ output_item = % Interface {
126+ name: name ,
127+ doc: doc ,
128+ line_start: line_start ,
129+ line_end: n
130+ }
117131
132+ % State { mode: nil , output: [ output_item | state . output ] , prev_doc: nil }
133+
134+ false ->
135+ mode = % ModeDefinition { type: :interface , name: name , doc: doc , line_start: line_start }
136+ % State { state | mode: mode , prev_doc: nil }
137+ end
138+ end
139+
140+ def do_reduce ( { "export interface " <> name_and_extends , n } , % State { mode: nil } = state ) do
141+ name = extract_name ( name_and_extends )
118142 { doc , line_start } = read_prev_doc ( state , n )
119143
120- mode = % ModeDefinition { type: :interface , name: name , doc: doc , line_start: line_start }
121- % State { state | mode: mode , prev_doc: nil }
144+ case name_and_extends |> String . trim_trailing ( ) |> String . ends_with? ( "}" ) do
145+ true ->
146+ output_item = % Interface {
147+ name: name ,
148+ doc: doc ,
149+ line_start: line_start ,
150+ line_end: n
151+ }
152+
153+ % State { mode: nil , output: [ output_item | state . output ] , prev_doc: nil }
154+
155+ false ->
156+ mode = % ModeDefinition { type: :interface , name: name , doc: doc , line_start: line_start }
157+ % State { state | mode: mode , prev_doc: nil }
158+ end
159+ end
160+
161+ def do_reduce ( { "export type " <> name_and_extends , n } , % State { mode: nil } = state ) do
162+ name = extract_name ( name_and_extends )
163+ { doc , line_start } = read_prev_doc ( state , n )
164+
165+ case name_and_extends |> String . trim_trailing ( ) |> String . ends_with? ( ";" ) do
166+ true ->
167+ output_item = % Type {
168+ name: name ,
169+ doc: doc ,
170+ line_start: line_start ,
171+ line_end: n
172+ }
173+
174+ % State { mode: nil , output: [ output_item | state . output ] , prev_doc: nil }
175+
176+ false ->
177+ mode = % ModeDefinition { type: :type , name: name , doc: doc , line_start: line_start }
178+ % State { state | mode: mode , prev_doc: nil }
179+ end
180+ end
181+
182+ def do_reduce ( { "type " <> name_and_extends , n } , % State { mode: nil } = state ) do
183+ name = extract_name ( name_and_extends )
184+ { doc , line_start } = read_prev_doc ( state , n )
185+
186+ case name_and_extends |> String . trim_trailing ( ) |> String . ends_with? ( ";" ) do
187+ true ->
188+ output_item = % Type {
189+ name: name ,
190+ doc: doc ,
191+ line_start: line_start ,
192+ line_end: n
193+ }
194+
195+ % State { mode: nil , output: [ output_item | state . output ] , prev_doc: nil }
196+
197+ false ->
198+ mode = % ModeDefinition { type: :type , name: name , doc: doc , line_start: line_start }
199+ % State { state | mode: mode , prev_doc: nil }
200+ end
122201 end
123202
124203 def do_reduce ( { "declare namespace " <> name_and_extends , n } , % State { mode: nil } = state ) do
@@ -204,6 +283,14 @@ defmodule ComponentsGuide.Research.Sources.Typescript do
204283 line_end: n
205284 }
206285
286+ :type ->
287+ % Type {
288+ name: mode . name ,
289+ doc: mode . doc ,
290+ line_start: mode . line_start ,
291+ line_end: n
292+ }
293+
207294 :namespace ->
208295 % Namespace {
209296 name: mode . name ,
@@ -224,10 +311,75 @@ defmodule ComponentsGuide.Research.Sources.Typescript do
224311 % State { mode: nil , output: [ output_item | state . output ] }
225312 end
226313
314+ def do_reduce ( { line , n } , % State { mode: % ModeDefinition { } } = state ) do
315+ line = line |> String . trim_trailing ( )
316+ # terminals = ["}", "};", ";"]
317+ # done? = Enum.any?(terminals, &String.ends_with?(line, &1))
318+
319+ # terminals = ["}", "};", ";"]
320+ end_curly? = String . ends_with? ( line , "}" ) || String . ends_with? ( line , "};" )
321+ end_semicolon? = String . ends_with? ( line , ";" )
322+
323+ done? =
324+ case { state . mode . type , end_curly? , end_semicolon? } do
325+ { :namespace , _ , _ } -> false
326+ { :type , _ , end_semicolon? } -> end_semicolon?
327+ { _ , end_curly? , _ } -> end_curly?
328+ end
329+
330+ case { state . mode . type , done? } do
331+ { _ , false } ->
332+ state
333+
334+ { :namespace , _ } ->
335+ state
336+
337+ { _ , true } ->
338+ mode = state . mode
339+
340+ output_item =
341+ case mode . type do
342+ :interface ->
343+ % Interface {
344+ name: mode . name ,
345+ doc: mode . doc ,
346+ line_start: mode . line_start ,
347+ line_end: n
348+ }
349+
350+ :type ->
351+ % Type {
352+ name: mode . name ,
353+ doc: mode . doc ,
354+ line_start: mode . line_start ,
355+ line_end: n
356+ }
357+
358+ :namespace ->
359+ % Namespace {
360+ name: mode . name ,
361+ doc: mode . doc ,
362+ line_start: mode . line_start ,
363+ line_end: n
364+ }
365+
366+ :global_var ->
367+ % GlobalVariable {
368+ name: mode . name ,
369+ doc: mode . doc ,
370+ line_start: mode . line_start ,
371+ line_end: n
372+ }
373+ end
374+
375+ % State { mode: nil , output: [ output_item | state . output ] }
376+ end
377+ end
378+
227379 def do_reduce ( _ , state ) , do: state
228380
229381 defp extract_name ( name_and_extends ) do
230- case String . split ( name_and_extends , [ " " , ":" , "(" ] , parts: 2 ) do
382+ case String . split ( name_and_extends , [ " " , ":" , "(" , "<" ] , parts: 2 ) do
231383 [ name | _ ] -> name
232384 _ -> nil
233385 end
0 commit comments