Skip to content

Commit a76494e

Browse files
Fix extra spaces when generating field-like structures (#193)
This removes the extra space when generating field expressions, function statements (like `Table0.fun`) and types using namespaces when the identifier before the `.` symbol ends with a number.
1 parent 1df4b13 commit a76494e

File tree

17 files changed

+123
-8
lines changed

17 files changed

+123
-8
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Unreleased
44

5+
* fix generators that creates spaces when writing field expressions, function statements and field-types ([#193](https://github.com/seaofvoices/darklua/pull/193))
6+
57
## 0.13.0
68

79
* add `convert` command to convert data files (`json`, `json5`, `yaml` and `toml`) into Lua modules ([#178](https://github.com/seaofvoices/darklua/pull/178))

src/generator/dense.rs

+19-3
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,18 @@ impl DenseLuaGenerator {
7070
}
7171
}
7272

73+
fn push_new_line_if_needed(&mut self, pushed_length: usize) {
74+
if self.current_line_length >= self.column_span {
75+
self.push_new_line();
76+
} else {
77+
let total_length = self.current_line_length + pushed_length;
78+
79+
if total_length > self.column_span {
80+
self.push_new_line();
81+
}
82+
}
83+
}
84+
7385
fn push_space_if_needed(&mut self, next_character: char, pushed_length: usize) {
7486
if self.current_line_length >= self.column_span {
7587
self.push_new_line();
@@ -391,7 +403,8 @@ impl LuaGenerator for DenseLuaGenerator {
391403

392404
self.push_str(name.get_name().get_name());
393405
name.get_field_names().iter().for_each(|field| {
394-
self.push_char('.');
406+
self.push_new_line_if_needed(1);
407+
self.raw_push_char('.');
395408
self.push_str(field.get_name());
396409
});
397410

@@ -728,7 +741,9 @@ impl LuaGenerator for DenseLuaGenerator {
728741
fn write_field(&mut self, field: &nodes::FieldExpression) {
729742
self.write_prefix(field.get_prefix());
730743

731-
self.push_char('.');
744+
self.push_new_line_if_needed(1);
745+
self.raw_push_char('.');
746+
732747
self.push_str(field.get_field().get_name());
733748
}
734749

@@ -951,7 +966,8 @@ impl LuaGenerator for DenseLuaGenerator {
951966

952967
fn write_type_field(&mut self, type_field: &nodes::TypeField) {
953968
self.write_identifier(type_field.get_namespace());
954-
self.push_char('.');
969+
self.push_new_line_if_needed(1);
970+
self.raw_push_char('.');
955971
self.write_type_name(type_field.get_type_name());
956972
}
957973

src/generator/mod.rs

+10
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,12 @@ mod $mod_name {
687687
Vec::new(),
688688
false
689689
),
690+
empty_with_name_ending_with_number_with_field => FunctionStatement::new(
691+
FunctionName::from_name("fn1").with_fields(vec!["bar".into()]),
692+
Block::default(),
693+
Vec::new(),
694+
false
695+
),
690696
empty_with_one_typed_parameter => FunctionStatement::from_name("fn", Block::default())
691697
.with_parameter(Identifier::new("a").with_type(TypeName::new("string"))),
692698
empty_with_two_typed_parameters => FunctionStatement::from_name("fn", Block::default())
@@ -741,6 +747,9 @@ mod $mod_name {
741747

742748
snapshot_node!($mod_name, $generator, type_declaration, write_type_declaration_statement => (
743749
string_alias => TypeDeclarationStatement::new("Str", TypeName::new("string")),
750+
type_field => TypeDeclarationStatement::new("Object", TypeField::new("module", TypeName::new("Object"))),
751+
type_field_with_name_ending_with_number
752+
=> TypeDeclarationStatement::new("Object", TypeField::new("module0", TypeName::new("Object"))),
744753
exported_string_alias => TypeDeclarationStatement::new("Str", TypeName::new("string"))
745754
.export(),
746755
generic_array => TypeDeclarationStatement::new("Array", ArrayType::new(TypeName::new("T")))
@@ -958,6 +967,7 @@ mod $mod_name {
958967

959968
snapshot_node!($mod_name, $generator, field, write_expression => (
960969
identifier_prefix => FieldExpression::new(Prefix::from_name("foo"), "bar"),
970+
identifier_ending_with_number_prefix => FieldExpression::new(Prefix::from_name("oof0"), "field"),
961971
));
962972

963973
snapshot_node!($mod_name, $generator, index, write_expression => (

src/generator/readable.rs

+22-2
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,24 @@ impl ReadableLuaGenerator {
175175
self.pop_indentation();
176176
}
177177

178+
fn push_new_line_if_needed(&mut self, pushed_length: usize) {
179+
if self.current_line_length == 0 && self.current_indentation != 0 {
180+
self.write_indentation();
181+
}
182+
183+
if self.can_add_new_line() {
184+
if self.current_line_length >= self.column_span {
185+
self.push_new_line();
186+
} else {
187+
let total_length = self.current_line_length + pushed_length;
188+
189+
if total_length > self.column_span {
190+
self.push_new_line();
191+
}
192+
}
193+
}
194+
}
195+
178196
fn push_space_if_needed(&mut self, next_character: char, pushed_length: usize) {
179197
if self.current_line_length == 0 && self.current_indentation != 0 {
180198
self.write_indentation();
@@ -980,7 +998,8 @@ impl LuaGenerator for ReadableLuaGenerator {
980998
self.write_prefix(field.get_prefix());
981999
self.pop_can_add_new_line();
9821000

983-
self.push_char('.');
1001+
self.push_new_line_if_needed(1);
1002+
self.raw_push_char('.');
9841003
self.raw_push_str(field.get_field().get_name());
9851004
}
9861005

@@ -1187,7 +1206,8 @@ impl LuaGenerator for ReadableLuaGenerator {
11871206

11881207
fn write_type_field(&mut self, type_field: &nodes::TypeField) {
11891208
self.write_identifier(type_field.get_namespace());
1190-
self.push_char('.');
1209+
self.push_new_line_if_needed(1);
1210+
self.raw_push_char('.');
11911211
self.write_type_name(type_field.get_type_name());
11921212
}
11931213

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
oof0.field
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
function fn1.bar()end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
type Object=module.Object
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
type Object=module0.Object
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
oof0.field
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
function fn1.bar() end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
type Object = module.Object
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
type Object = module0.Object
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
oof0.field
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
function fn1.bar()end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
type Object=module.Object
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
source: src/generator/mod.rs
3+
expression: generator.into_string()
4+
---
5+
type Object=module0.Object

src/generator/token_based.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -436,9 +436,9 @@ impl<'a> TokenBasedLuaGenerator<'a> {
436436
.enumerate()
437437
.for_each(|(i, field)| {
438438
if let Some(period) = tokens.periods.get(i) {
439-
self.write_token(period);
439+
self.write_token_options(period, false);
440440
} else {
441-
self.write_symbol(".");
441+
self.write_symbol_without_space_check(".");
442442
}
443443
self.write_identifier(field);
444444
});
@@ -773,7 +773,7 @@ impl<'a> TokenBasedLuaGenerator<'a> {
773773

774774
fn write_type_field_with_token(&mut self, type_field: &TypeField, token: &Token) {
775775
self.write_identifier(type_field.get_namespace());
776-
self.write_token(token);
776+
self.write_token_options(token, false);
777777
self.write_type_name(type_field.get_type_name());
778778
}
779779

@@ -1572,6 +1572,13 @@ impl<'a> TokenBasedLuaGenerator<'a> {
15721572
self.push_str(symbol);
15731573
}
15741574

1575+
fn write_symbol_without_space_check(&mut self, symbol: &str) {
1576+
if self.currently_commenting {
1577+
self.uncomment();
1578+
}
1579+
self.push_str(symbol);
1580+
}
1581+
15751582
fn write_typed_identifier(&mut self, typed_identifier: &TypedIdentifier) {
15761583
if let Some(token) = typed_identifier.get_token() {
15771584
let name_in_token = token.read(self.original_code);

0 commit comments

Comments
 (0)