Skip to content

Commit 54df03d

Browse files
committed
Recreate leading line spaces
1 parent f3c60ea commit 54df03d

File tree

2 files changed

+99
-80
lines changed

2 files changed

+99
-80
lines changed

openc3/lib/openc3/utilities/ruby_lex_utils.rb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,28 @@ def each_lexed_segment(text)
6060
# for what is returned by Prism.lex
6161
# We process the tokens in pairs to recreate spacing and handle string assignments
6262
tokens.each_cons(2) do |(token, lex_state), (next_token, _next_lex_state)|
63+
# pp token # Uncomment for debugging
6364
# Ignore embedded documentation must be at column 0 and looks like:
6465
=begin
6566
This is a comment
6667
And so is this
6768
=end
6869
if token.type == :EMBDOC_BEGIN or token.type == :EMBDOC_LINE or token.type == :EMBDOC_END
70+
prev_token = token
6971
next
7072
end
7173

74+
# Recreate the spaces at the beginning of a line
75+
# This has to come before we add the token.value to the line
76+
if prev_token.nil?
77+
line += ' ' * token.location.start_column
78+
# If the previous token is STRING_CONTENT it is probably string interpolation so ignore it
79+
# Otherwise if the previous token has changed lines we're on a newline so add space
80+
elsif prev_token.type != :STRING_CONTENT and prev_token.location.end_line - prev_token.location.start_line > 0
81+
line += ' ' * token.location.start_column
82+
end
83+
prev_token = token
84+
7285
# Comments require tacking on a newline but are otherwise ignored
7386
if token.type == :COMMENT
7487
line += "\n"
@@ -149,7 +162,6 @@ def each_lexed_segment(text)
149162
orig_line_no = nil
150163
line_no = nil
151164
end
152-
prev_token = token
153165
end
154166
end
155167
end

openc3/spec/utilities/ruby_lex_utils_spec.rb

Lines changed: 86 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ module OpenC3
4242
DOC
4343
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
4444
["begin\n", false, true, 5], # can't instrument begin
45-
["x = 0\n", true, true, 6],
45+
[" x = 0\n", true, true, 6],
4646
["end\n", false, false, 7] # can't instrument end
4747
)
4848
end
@@ -60,9 +60,9 @@ module OpenC3
6060
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
6161
["\n", true, false, 1],
6262
["puts \"HI\"\n", true, false, 2],
63-
["\n", true, false, 3],
64-
["\n", true, false, 4],
65-
["puts ENV.inspect\n", true, false, 5],
63+
[" \n", true, false, 3],
64+
[" \n", true, false, 4],
65+
[" puts ENV.inspect\n", true, false, 5],
6666
["puts('YES') \n", true, false, 6],
6767
["pp ENV\n", true, false, 7]
6868
)
@@ -83,12 +83,12 @@ module OpenC3
8383
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
8484
["z = 5\n", true, false, 1],
8585
["begin\n", false, true, 2], # can't instrument begin
86-
["a = 0\n", true, true, 3],
87-
["begin\n", false, true, 4],
88-
["x = 0\n", true, true, 5],
89-
["rescue\n", false, true, 6],
90-
["x = 1\n", true, true, 7],
91-
["end\n", false, true, 8],
86+
[" a = 0\n", true, true, 3],
87+
[" begin\n", false, true, 4],
88+
[" x = 0\n", true, true, 5],
89+
[" rescue\n", false, true, 6],
90+
[" x = 1\n", true, true, 7],
91+
[" end\n", false, true, 8],
9292
["end\n", false, false, 9]
9393
) # can't instrument end
9494
end
@@ -113,7 +113,9 @@ module OpenC3
113113
}.each {|x, y| puts x}
114114
DOC
115115
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
116-
["{ :X1 => 1,\n:X2 => 2\n}.each {|x, y| puts x}\n", false, false, 1]
116+
["{ :X1 => 1,\n" +
117+
" :X2 => 2\n" +
118+
"}.each {|x, y| puts x}\n", false, false, 1]
117119
)
118120
end
119121

@@ -141,23 +143,23 @@ module OpenC3
141143
DOC
142144
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
143145
["limits = {\n" +
144-
"'val' => {\n" +
145-
"'val Voltage' => {\n" +
146-
"'tlm_name' => 'target packet item',\n" +
147-
"'metric' => 'V',\n" +
148-
"'requirement_id' => nil,\n" +
149-
"'off_limits' => {\n" +
150-
"'yellow_lower' => nil,\n" +
151-
"'red_lower' => nil\n" +
152-
"},\n" +
153-
"'on_limits' => {\n" +
154-
"'red_lower' => 1,\n" +
155-
"'yellow_lower' => 1,\n" +
156-
"'yellow_upper' => 1,\n" +
157-
"'red_upper' => 1\n" +
158-
"}\n" +
159-
"}\n" +
160-
"}\n" +
146+
" 'val' => {\n" +
147+
" 'val Voltage' => {\n" +
148+
" 'tlm_name' => 'target packet item',\n" +
149+
" 'metric' => 'V',\n" +
150+
" 'requirement_id' => nil,\n" +
151+
" 'off_limits' => {\n" +
152+
" 'yellow_lower' => nil,\n" +
153+
" 'red_lower' => nil\n" +
154+
" },\n" +
155+
" 'on_limits' => {\n" +
156+
" 'red_lower' => 1,\n" +
157+
" 'yellow_lower' => 1,\n" +
158+
" 'yellow_upper' => 1,\n" +
159+
" 'red_upper' => 1\n" +
160+
" }\n" +
161+
" }\n" +
162+
" }\n" +
161163
"}\n", true, false, 1]
162164
)
163165
end
@@ -183,20 +185,20 @@ module OpenC3
183185
DOC
184186
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
185187
["array = [\n" +
186-
"1, 2, 3,\n" +
187-
"4,\n" +
188-
"[\n" +
189-
"5, 6, 7\n" +
190-
"],\n" +
191-
"{\n" +
192-
"'tlm_name' => 'target packet item',\n" +
193-
"'metric' => 'V',\n" +
194-
"'requirement_id' => nil,\n" +
195-
"'off_limits' => {\n" +
196-
"'yellow_lower' => nil,\n" +
197-
"'red_lower' => nil\n" +
198-
"},\n" +
199-
"}\n" +
188+
" 1, 2, 3,\n" +
189+
" 4,\n" +
190+
" [\n" +
191+
" 5, 6, 7\n" +
192+
" ],\n" +
193+
" {\n" +
194+
" 'tlm_name' => 'target packet item',\n" +
195+
" 'metric' => 'V',\n" +
196+
" 'requirement_id' => nil,\n" +
197+
" 'off_limits' => {\n" +
198+
" 'yellow_lower' => nil,\n" +
199+
" 'red_lower' => nil\n" +
200+
" },\n" +
201+
" }\n" +
200202
"]\n", true, false, 1]
201203
)
202204
end
@@ -266,11 +268,11 @@ module OpenC3
266268
["wait_check(\"INST HEALTH_STATUS COLLECTS > \#{collects}\", 5)\n", true, false, 3],
267269
["\n", true, false, 4],
268270
["begin\n", false, true, 5],
269-
["loop do\n", false, true, 6],
270-
["puts 'hi'\n", true, true, 7],
271-
["end\n", false, true, 8],
271+
[" loop do\n", false, true, 6],
272+
[" puts 'hi'\n", true, true, 7],
273+
[" end\n", false, true, 8],
272274
["rescue\n", false, true, 9],
273-
["puts 'error'\n", true, true, 10],
275+
[" puts 'error'\n", true, true, 10],
274276
["end\n", false, false, 11]
275277
)
276278
end
@@ -333,20 +335,20 @@ def self.class_method(variable, keyword:)
333335
DOC
334336
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
335337
["class Test\n", false, false, 1],
336-
["def instance_method(variable)\n", false, false, 2],
337-
["puts variable\n", true, false, 3],
338-
["if variable\n", false, false, 4],
339-
["puts 'another puts'\n", true, false, 5],
340-
["end\n", false, false, 6],
341-
["end\n", false, false, 7],
338+
[" def instance_method(variable)\n", false, false, 2],
339+
[" puts variable\n", true, false, 3],
340+
[" if variable\n", false, false, 4],
341+
[" puts 'another puts'\n", true, false, 5],
342+
[" end\n", false, false, 6],
343+
[" end\n", false, false, 7],
342344
["\n", true, false, 8],
343-
["def self.class_method(variable, keyword:)\n", false, false, 9],
344-
["begin\n", false, true, 10],
345-
["puts variable\n", true, true, 11],
346-
["rescue\n", false, true, 12],
347-
["puts keyword\n", true, true, 13],
348-
["end\n", false, false, 14],
349-
["end\n", false, false, 15],
345+
[" def self.class_method(variable, keyword:)\n", false, false, 9],
346+
[" begin\n", false, true, 10],
347+
[" puts variable\n", true, true, 11],
348+
[" rescue\n", false, true, 12],
349+
[" puts keyword\n", true, true, 13],
350+
[" end\n", false, false, 14],
351+
[" end\n", false, false, 15],
350352
["end\n", false, false, 16],
351353
["\n", true, false, 17],
352354
["test = Test.new\n", true, false, 18],
@@ -368,14 +370,14 @@ def instance_method(
368370
DOC
369371
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
370372
["class Test\n", false, false, 1],
371-
["def instance_method(\n" +
372-
"variable1,\n" +
373-
"variable2,\n" +
374-
"variable3,\n" +
375-
"variable4\n" +
376-
")\n", false, false, 2],
377-
["puts variable1\n", true, false, 8],
378-
["end\n", false, false, 9],
373+
[" def instance_method(\n" +
374+
" variable1,\n" +
375+
" variable2,\n" +
376+
" variable3,\n" +
377+
" variable4\n" +
378+
" )\n", false, false, 2],
379+
[" puts variable1\n", true, false, 8],
380+
[" end\n", false, false, 9],
379381
["end\n", false, false, 10]
380382
)
381383
end
@@ -389,11 +391,11 @@ def instance_method(
389391
end
390392
DOC
391393
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
392-
["if true\n", false, false, 1],
393-
["unless false\n", false, false, 2],
394-
["puts 'hi'\n", true, false, 3],
394+
[" if true\n", false, false, 1],
395+
[" unless false\n", false, false, 2],
396+
[" puts 'hi'\n", true, false, 3],
395397
["end\n", false, false, 4],
396-
["end\n", false, false, 5]
398+
[" end\n", false, false, 5]
397399
)
398400
end
399401

@@ -403,7 +405,8 @@ def instance_method(
403405
DURATION \#{duration}")
404406
DOC
405407
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
406-
["cmd(\"INST COLLECT with TYPE \#{type},\n DURATION \#{duration}\")\n", true, false, 1],
408+
["cmd(\"INST COLLECT with TYPE \#{type},\n"+
409+
" DURATION \#{duration}\")\n", true, false, 1],
407410
)
408411
end
409412

@@ -416,7 +419,11 @@ def instance_method(
416419
END"
417420
DOC
418421
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
419-
["definition = \"\n SCREEN AUTO AUTO 1.0\n VERTICALBOX 'Test Screen'\n LABELVALUE \#{target} \#{packet} \#{item}\n END\"\n", true, false, 1]
422+
["definition = \"\n"+
423+
" SCREEN AUTO AUTO 1.0\n"+
424+
" VERTICALBOX 'Test Screen'\n"+
425+
" LABELVALUE \#{target} \#{packet} \#{item}\n"+
426+
" END\"\n", true, false, 1]
420427
)
421428
end
422429

@@ -441,13 +448,13 @@ def instance_method(
441448
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
442449
["array = [1, 2, 3]\n", true, false, 1],
443450
["array.each do |value|\n", false, false, 2],
444-
["puts value\n", true, false, 3],
451+
[" puts value\n", true, false, 3],
445452
["end\n", false, false, 4],
446-
["array.each {\nputs \"an item\"\n}\n", false, false, 5],
453+
["array.each {\n puts \"an item\"\n}\n", false, false, 5],
447454
["begin\n", false, true, 8],
448-
["puts \"another\"\n", true, true, 9],
455+
[" puts \"another\"\n", true, true, 9],
449456
["rescue Exception => err\n", false, true, 10],
450-
["puts err\n", true, true, 11],
457+
[" puts err\n", true, true, 11],
451458
["end\n", false, false, 12],
452459
["begin; puts \"in begin\"\n", false, true, 13],
453460
["rescue; puts \"in rescue\"\n", false, true, 14],
@@ -468,11 +475,11 @@ def method2
468475
DOC
469476
expect { |b| @lex.each_lexed_segment(text, &b) }.to yield_successive_args(
470477
["def method1\n", false, false, 1],
471-
["a = \"part1\" +\n\"part2\"\n", true, false, 2],
478+
[" a = \"part1\" +\n \"part2\"\n", true, false, 2],
472479
["end\n", false, false, 4],
473480
["\n", true, false, 5],
474481
["def method2\n", false, false, 6],
475-
["a = 5\n", true, false, 7],
482+
[" a = 5\n", true, false, 7],
476483
["end\n", false, false, 8],
477484
)
478485
end

0 commit comments

Comments
 (0)