aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Gavin <danielgavin5@hotmail.com>2021-12-10 18:44:56 +0100
committerDaniel Gavin <danielgavin5@hotmail.com>2021-12-10 18:44:56 +0100
commitf29c536bac54af2b7776e257ab92f981e4e1e0a4 (patch)
treee653187878f7e277afd046a9cd10142787f2af9a /src
parent021328892b6d488ef81b98b4d42cda230bde2e44 (diff)
odinfmt fixes
Diffstat (limited to 'src')
-rw-r--r--src/odin/printer/printer.odin17
-rw-r--r--src/odin/printer/visit.odin41
2 files changed, 42 insertions, 16 deletions
diff --git a/src/odin/printer/printer.odin b/src/odin/printer/printer.odin
index 1241171..444148f 100644
--- a/src/odin/printer/printer.odin
+++ b/src/odin/printer/printer.odin
@@ -22,11 +22,16 @@ Printer :: struct {
indentation: string,
newline: string,
indentation_count: int,
- disabled_lines: map[int]string,
- last_disabled_line: int,
+ disabled_lines: map[int]Disabled_Info,
+ disabled_until_line: int,
src: string,
}
+Disabled_Info :: struct {
+ text: string,
+ end_line: int,
+}
+
Config :: struct {
max_characters: int,
spaces: int, //Spaces per indentation
@@ -110,8 +115,14 @@ build_disabled_lines_info :: proc(p: ^Printer) {
} else if strings.contains(comment.text[:], "//odinfmt: enable") && found_disable {
begin := disable_position.offset - (comment.pos.column - 1)
end := comment.pos.offset+len(comment.text)
+
+ disabled_info := Disabled_Info {
+ end_line = comment.pos.line,
+ text = p.src[begin:end],
+ }
+
for line := disable_position.line; line <= comment.pos.line; line += 1 {
- p.disabled_lines[line] = p.src[begin:end]
+ p.disabled_lines[line] = disabled_info
}
found_disable = false
diff --git a/src/odin/printer/visit.odin b/src/odin/printer/visit.odin
index b622ec7..b4c9f94 100644
--- a/src/odin/printer/visit.odin
+++ b/src/odin/printer/visit.odin
@@ -159,13 +159,18 @@ visit_comments :: proc(p: ^Printer, pos: tokenizer.Pos, end_newline := true) ->
}
visit_disabled :: proc(p: ^Printer, node: ^ast.Node) -> ^Document {
- disabled_text := p.disabled_lines[node.pos.line]
+
+ if node.pos.line not_in p.disabled_lines {
+ return empty()
+ }
+
+ disabled_info := p.disabled_lines[node.pos.line]
- if p.last_disabled_line + 1 == node.pos.line {
- return empty();
+ if disabled_info.text == "" {
+ return empty()
}
- if disabled_text == "" {
+ if p.disabled_until_line > node.pos.line {
return empty()
}
@@ -175,11 +180,10 @@ visit_disabled :: proc(p: ^Printer, node: ^ast.Node) -> ^Document {
next_comment_group(p)
}
- p.last_disabled_line = node.pos.line
-
p.source_position = node.end
+ p.disabled_until_line = disabled_info.end_line
- return cons(nest(-p.indentation_count, move), text(disabled_text))
+ return cons(nest(-p.indentation_count, move), text(disabled_info.text))
}
@(private)
@@ -856,6 +860,8 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, called_from: Expr_Called_Type =
set_source_position(p, expr.end);
}
+ fmt.println(expr.derived)
+
switch v in expr.derived {
case Inline_Asm_Expr:
document := cons(text_token(p, v.tok), text("("))
@@ -874,12 +880,21 @@ visit_expr :: proc(p: ^Printer, expr: ^ast.Expr, called_from: Expr_Called_Type =
case Auto_Cast:
return cons_with_nopl(text_token(p, v.op), visit_expr(p, v.expr))
case Ternary_If_Expr:
- document := visit_expr(p, v.cond)
- document = cons_with_nopl(document, text_token(p, v.op1))
- document = cons_with_nopl(document, visit_expr(p, v.x))
- document = cons_with_nopl(document, text_token(p, v.op2))
- document = cons_with_nopl(document, visit_expr(p, v.y))
- return document
+ if v.op1.text == "if" {
+ document := visit_expr(p, v.x)
+ document = cons_with_nopl(document, text_token(p, v.op1))
+ document = cons_with_nopl(document, visit_expr(p, v.cond))
+ document = cons_with_nopl(document, text_token(p, v.op2))
+ document = cons_with_nopl(document, visit_expr(p, v.y))
+ return document
+ } else {
+ document := visit_expr(p, v.cond)
+ document = cons_with_nopl(document, text_token(p, v.op1))
+ document = cons_with_nopl(document, visit_expr(p, v.x))
+ document = cons_with_nopl(document, text_token(p, v.op2))
+ document = cons_with_nopl(document, visit_expr(p, v.y))
+ return document
+ }
case Ternary_When_Expr:
document := visit_expr(p, v.cond)
document = cons_with_nopl(document, text_token(p, v.op1))