This commit is contained in:
2025-11-25 06:10:17 +01:00
parent 50a770c3ca
commit c755821e34
2 changed files with 42 additions and 22 deletions

View File

@@ -9,6 +9,24 @@ fn test_parse_header_file() {
assert name == 'main.v' assert name == 'main.v'
} }
fn test_parse_header_file2() {
kind, name := parse_header('===FILE:main.v ===')!
assert kind == BlockKind.file
assert name == 'main.v'
}
fn test_parse_header_file3() {
kind, name := parse_header('=== FILE:main.v ===')!
assert kind == BlockKind.file
assert name == 'main.v'
}
fn test_parse_header_file4() {
kind, name := parse_header('== FILE: main.v =====')!
assert kind == BlockKind.file
assert name == 'main.v'
}
fn test_parse_header_filechange() { fn test_parse_header_filechange() {
kind, name := parse_header('===FILECHANGE:utils/helper.v===')! kind, name := parse_header('===FILECHANGE:utils/helper.v===')!
assert kind == BlockKind.filechange assert kind == BlockKind.filechange

View File

@@ -48,12 +48,19 @@ fn filemap_get_from_content(content string) !FileMap {
for line in content.split_into_lines() { for line in content.split_into_lines() {
linenr += 1 linenr += 1
line_trimmed := line.trim_space() parsed_kind, parsed_name := parse_header(line)! // Call parse_header with the raw line
kind, name := parse_header(line_trimmed)! mut is_a_header_line := false
if parsed_kind == .file || parsed_kind == .filechange {
is_a_header_line = true
} else if parsed_kind == .end && line.trim_space().to_lower() == '===end===' {
// This is explicitly an END header
is_a_header_line = true
}
match kind { if is_a_header_line {
.end { // Handle the header line (logic similar to current .file, .filechange, and .end blocks)
if parsed_kind == .end { // It's the explicit ===END===
if filename == '' { if filename == '' {
if had_any_block { if had_any_block {
fm.errors << FMError{ fm.errors << FMError{
@@ -79,8 +86,7 @@ fn filemap_get_from_content(content string) !FileMap {
block = []string{} block = []string{}
current_kind = .end current_kind = .end
} }
} } else { // It's a FILE or FILECHANGE header
.file, .filechange {
// Flush previous block if any // Flush previous block if any
if filename != '' { if filename != '' {
match current_kind { match current_kind {
@@ -89,26 +95,22 @@ fn filemap_get_from_content(content string) !FileMap {
else {} else {}
} }
} }
filename = name filename = parsed_name
current_kind = kind current_kind = parsed_kind
block = []string{} block = []string{}
had_any_block = true had_any_block = true
} }
} } else {
// This is a content line (parse_header returned .end, but it wasn't '===END===')
// Accumulate non-header lines if filename == '' && line.trim_space().len > 0 {
if kind == .end || kind == .file || kind == .filechange { fm.errors << FMError{
continue message: "Content before first FILE block: '${line}'"
} linenr: linenr
category: 'parse'
if filename == '' && line_trimmed.len > 0 { }
fm.errors << FMError{ } else if filename != '' {
message: "Content before first FILE block: '${line}'" block << line
linenr: linenr
category: 'parse'
} }
} else if filename != '' {
block << line
} }
} }