Răsfoiți Sursa

fixing calls in calls

Daniel Gavin 4 ani în urmă
părinte
comite
a721802337
1 a modificat fișierele cu 50 adăugiri și 102 ștergeri
  1. 50 102
      core/odin/printer/printer.odin

+ 50 - 102
core/odin/printer/printer.odin

@@ -229,7 +229,7 @@ format_value_decl :: proc(p: ^Printer, index: int) {
 		}
 
 		if align_next {
-			line.format_tokens[0].spaces_before += largest + 1;
+			line.format_tokens[0].spaces_before = largest + 1;
 			align_next = false;
 		}
 
@@ -264,37 +264,41 @@ format_assignment :: proc(p: ^Printer, index: int) {
 	
 }
 
-format_call :: proc(p: ^Printer, index: int) {
+format_call :: proc(p: ^Printer, line_index: int, format_index: int) {
 
 	paren_found := false;
 	paren_token: Format_Token;
 	paren_line: int;
+	paren_token_index: int;
 	largest := 0;
 
-	found_paren: for line, line_index in p.lines[index:] {
-		for format_token in line.format_tokens {
+	found_paren: for line, i in p.lines[line_index:] {
+		for format_token, j in line.format_tokens {
 
 			largest += len(format_token.text) + format_token.spaces_before;
 
+			if i == 0 && j < format_index {
+				continue;
+			}
+
 			if format_token.kind == .Open_Paren && format_token.type == .Call {
 				paren_token = format_token;
-				paren_line = line_index + index;
+				paren_line = line_index + i;
 				paren_found = true;
+				paren_token_index = j;
 				break found_paren;
-			} else if format_token.kind == .Open_Paren {
-				return;
-			}
+			} 
 		}
 	}
 
 	if !paren_found {
-		return;
+		panic("Should not be possible");;
 	}
 
 	paren_count := 1;
 	done := false;
 
-	for line, line_index in p.lines[paren_line+1:] {
+	for line, line_index in p.lines[paren_line:] {
 
 		if len(line.format_tokens) == 0 {
 			continue;
@@ -302,6 +306,10 @@ format_call :: proc(p: ^Printer, index: int) {
 
 		for format_token, i in line.format_tokens {
 			
+			if line_index == 0 && i <= paren_token_index {
+				continue;
+			}
+
 			if format_token.kind == .Open_Paren {
 				paren_count += 1;
 			} else if format_token.kind == .Close_Paren {
@@ -314,44 +322,45 @@ format_call :: proc(p: ^Printer, index: int) {
 
 		}
 
-		line.format_tokens[0].spaces_before += largest;
+		if line_index != 0 {
+			line.format_tokens[0].spaces_before = largest;
+		}
 
 		if done {
 			return;
 		}
-
 	}
 }
 
-format_for :: proc(p: ^Printer, index: int) {
+format_keyword_to_brace :: proc(p: ^Printer, line_index: int, format_index: int, keyword: tokenizer.Token_Kind) {
 
-	for_found := false;
-	for_token: Format_Token;
-	for_line: int;
+	keyword_found := false;
+	keyword_token: Format_Token;
+	keyword_line: int;
 	largest := 0;
 
-	found_for: for line, line_index in p.lines[index:] {
+	brace_count := 0;
+	done := false;
+
+	found_keyword: for line, i in p.lines[line_index:] {
 		for format_token in line.format_tokens {
 
 			largest += len(format_token.text) + format_token.spaces_before;
 
-			if format_token.kind == .For {
-				for_token = format_token;
-				for_line = line_index + index;
-				for_found = true;
-				break found_for;
+			if format_token.kind == keyword {
+				keyword_token = format_token;
+				keyword_line = line_index + i;
+				keyword_found = true;
+				break found_keyword;
 			} 
 		}
 	}
 
-	if !for_found {
-		return;
+	if !keyword_found {
+		panic("Should not be possible");
 	}
 
-	brace_count := 0;
-	done := false;
-
-	for line, line_index in p.lines[for_line:] {
+	for line, line_index in p.lines[keyword_line:] {
 
 		if len(line.format_tokens) == 0 {
 			continue;
@@ -372,7 +381,7 @@ format_for :: proc(p: ^Printer, index: int) {
 		}
 
 		if line_index != 0 {
-			line.format_tokens[0].spaces_before += largest + 1;
+			line.format_tokens[0].spaces_before = largest + 1;
 		}
 
 		if done {
@@ -383,75 +392,25 @@ format_for :: proc(p: ^Printer, index: int) {
 	
 }
 
-format_if :: proc(p: ^Printer, index: int) {
-
-	if_found := false;
-	if_token: Format_Token;
-	if_line: int;
-	largest := 0;
-
-	found_if: for line, line_index in p.lines[index:] {
-		for format_token in line.format_tokens {
-
-			largest += len(format_token.text) + format_token.spaces_before;
-
-			if format_token.kind == .If {
-				if_token = format_token;
-				if_line = line_index + index;
-				if_found = true;
-				break found_if;
-			} 
-		}
-	}
-
-	if !if_found {
-		return;
-	}
-
-	brace_count := 0;
-	done := false;
+format_generic :: proc(p: ^Printer) {
 
-	for line, line_index in p.lines[if_line:] {
+	for line, line_index in p.lines {
 
-		if len(line.format_tokens) == 0 {
+		if len(line.format_tokens) <= 0 {
 			continue;
 		}
 
-		for format_token, i in line.format_tokens {
-			
-			if format_token.kind == .Open_Brace {
-				brace_count += 1;
-			} else if format_token.kind == .Close_Brace {
-				brace_count -= 1;
-			}
+		for format_token, token_index in line.format_tokens {
 
-			if brace_count == 1 {
-				done = true;
+			if format_token.kind == .For || format_token.kind == .If
+			|| format_token.kind == .When || format_token.kind == .Switch {
+				format_keyword_to_brace(p, line_index, token_index, format_token.kind);
+			} else if format_token.type == .Call {
+				format_call(p, line_index, token_index);
 			}
 
 		}
 
-		if line_index != 0 {
-			line.format_tokens[0].spaces_before += largest + 1;
-		}
-
-		if done {
-			break;
-		}
-
-	}
-
-}
-
-
-format_generic :: proc(p: ^Printer) {
-
-	for line, line_index in p.lines {
-
-		if len(line.format_tokens) <= 0 {
-			continue;
-		}
-
 		if .Switch_Stmt in line.types && p.config.align_switch {
 			align_switch_stmt(p, line_index);
 		}
@@ -468,17 +427,6 @@ format_generic :: proc(p: ^Printer) {
 			format_assignment(p, line_index);
 		}
 
-		if .Call in line.types {
-			format_call(p, line_index);
-		}
-
-		if .If in line.types {
-			format_if(p, line_index);
-		}
-
-		if .For in line.types {
-			format_for(p, line_index);
-		}
 	}
 }
 	
@@ -568,7 +516,7 @@ align_switch_stmt :: proc(p: ^Printer, index: int) {
 
 			//this will only happen if the case is one lined
 			if case_found && colon_found {
-				line.format_tokens[i].spaces_before += (largest - length);
+				line.format_tokens[i].spaces_before = (largest - length);
 				break;
 			}
 
@@ -736,9 +684,9 @@ align_comments :: proc(p: ^Printer) {
 
 				if format_token.kind == .Comment {
 					if len(l.format_tokens) == 1 {
-						l.format_tokens[i].spaces_before += info.length + 1;
+						l.format_tokens[i].spaces_before = info.length + 1;
 					} else {
-						l.format_tokens[i].spaces_before += info.length - length;
+						l.format_tokens[i].spaces_before = info.length - length + 1;
 					}
 				}