Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c568162

Browse files
committed
Use a single TrapWriter
The output of two distinct TrapWriters should not be written to the same TRAP file because this causes name clashes between TRAP labels.
1 parent cc1bdf1 commit c568162

2 files changed

Lines changed: 29 additions & 23 deletions

File tree

extractor/src/extractor.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ use std::borrow::Cow;
33
use std::collections::BTreeMap as Map;
44
use std::collections::BTreeSet as Set;
55
use std::fmt;
6+
use std::io::Write;
67
use std::path::Path;
8+
79
use tracing::{error, info, span, Level};
810
use tree_sitter::{Language, Node, Parser, Range, Tree};
911

10-
struct TrapWriter {
12+
pub struct TrapWriter {
1113
/// The accumulated trap entries
1214
trap_output: Vec<TrapEntry>,
1315
/// A counter for generating fresh labels
@@ -16,7 +18,7 @@ struct TrapWriter {
1618
global_keys: std::collections::HashMap<String, Label>,
1719
}
1820

19-
fn new_trap_writer() -> TrapWriter {
21+
pub fn new_trap_writer() -> TrapWriter {
2022
TrapWriter {
2123
counter: 0,
2224
trap_output: Vec::new(),
@@ -147,17 +149,22 @@ impl TrapWriter {
147149
fn comment(&mut self, text: String) {
148150
self.trap_output.push(TrapEntry::Comment(text));
149151
}
152+
153+
pub fn output(self, writer: &mut dyn Write) -> std::io::Result<()> {
154+
write!(writer, "{}", Program(self.trap_output))
155+
}
150156
}
151157

152158
/// Extracts the source file at `path`, which is assumed to be canonicalized.
153159
pub fn extract(
154160
language: Language,
155161
language_prefix: &str,
156162
schema: &NodeTypeMap,
163+
trap_writer: &mut TrapWriter,
157164
path: &Path,
158165
source: &Vec<u8>,
159166
ranges: &[Range],
160-
) -> std::io::Result<Program> {
167+
) -> std::io::Result<()> {
161168
let span = span!(
162169
Level::TRACE,
163170
"extract",
@@ -172,8 +179,7 @@ pub fn extract(
172179
parser.set_language(language).unwrap();
173180
parser.set_included_ranges(&ranges).unwrap();
174181
let tree = parser.parse(&source, None).expect("Failed to parse file");
175-
let mut trap_writer = new_trap_writer();
176-
trap_writer.comment(format!("Auto-generated TRAP file for {}", path.display()));
182+
&trap_writer.comment(format!("Auto-generated TRAP file for {}", path.display()));
177183
let file_label = &trap_writer.populate_file(path);
178184
let mut visitor = Visitor {
179185
source: &source,
@@ -190,7 +196,7 @@ pub fn extract(
190196
traverse(&tree, &mut visitor);
191197

192198
parser.reset();
193-
Ok(Program(visitor.trap_writer.trap_output))
199+
Ok(())
194200
}
195201

196202
/// Escapes a string for use in a TRAP key, by replacing special characters with
@@ -290,7 +296,7 @@ struct Visitor<'a> {
290296
/// The source code as a UTF-8 byte array
291297
source: &'a Vec<u8>,
292298
/// A TrapWriter to accumulate trap entries
293-
trap_writer: TrapWriter,
299+
trap_writer: &'a mut TrapWriter,
294300
/// A counter for tokens
295301
token_counter: usize,
296302
/// A counter for top-level child nodes

extractor/src/main.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use clap;
66
use flate2::write::GzEncoder;
77
use rayon::prelude::*;
88
use std::fs;
9-
use std::io::{BufRead, BufWriter, Write};
9+
use std::io::{BufRead, BufWriter};
1010
use std::path::{Path, PathBuf};
1111
use tree_sitter::{Language, Parser, Range};
1212

@@ -135,17 +135,18 @@ fn main() -> std::io::Result<()> {
135135
let src_archive_file = path_for(&src_archive_dir, &path, "");
136136
let mut source = std::fs::read(&path)?;
137137
let code_ranges;
138-
let erb_trap;
138+
let mut trap_writer = extractor::new_trap_writer();
139139
if path.extension().map_or(false, |x| x == "erb") {
140140
tracing::info!("scanning: {}", path.display());
141-
erb_trap = Some(extractor::extract(
141+
extractor::extract(
142142
erb,
143143
"erb",
144144
&erb_schema,
145+
&mut trap_writer,
145146
&path,
146147
&source,
147148
&[],
148-
)?);
149+
)?;
149150

150151
let (ranges, line_breaks) = scan_erb(erb, &source);
151152
for i in line_breaks {
@@ -156,27 +157,26 @@ fn main() -> std::io::Result<()> {
156157
code_ranges = ranges;
157158
} else {
158159
code_ranges = vec![];
159-
erb_trap = None;
160160
}
161-
let trap = extractor::extract(language, "ruby", &schema, &path, &source, &code_ranges)?;
161+
extractor::extract(
162+
language,
163+
"ruby",
164+
&schema,
165+
&mut trap_writer,
166+
&path,
167+
&source,
168+
&code_ranges,
169+
)?;
162170
std::fs::create_dir_all(&src_archive_file.parent().unwrap())?;
163171
std::fs::copy(&path, &src_archive_file)?;
164172
std::fs::create_dir_all(&trap_file.parent().unwrap())?;
165173
let trap_file = std::fs::File::create(&trap_file)?;
166174
let mut trap_file = BufWriter::new(trap_file);
167175
match trap_compression {
168-
TrapCompression::None => {
169-
if let Some(erb_trap) = erb_trap {
170-
write!(trap_file, "{}", erb_trap)?;
171-
}
172-
write!(trap_file, "{}", trap)
173-
}
176+
TrapCompression::None => trap_writer.output(&mut trap_file),
174177
TrapCompression::Gzip => {
175178
let mut compressed_writer = GzEncoder::new(trap_file, flate2::Compression::fast());
176-
if let Some(erb_trap) = erb_trap {
177-
write!(compressed_writer, "{}", erb_trap)?;
178-
}
179-
write!(compressed_writer, "{}", trap)
179+
trap_writer.output(&mut compressed_writer)
180180
}
181181
}
182182
})

0 commit comments

Comments
 (0)