Skip to content

Commit 9cde48a

Browse files
Create a parse file context
1 parent edf4695 commit 9cde48a

File tree

6 files changed

+43
-31
lines changed

6 files changed

+43
-31
lines changed

cli/src/parse.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::{
77
path::PathBuf,
88
};
99
use typeshare_core::{
10-
context::ParseContext,
10+
context::{ParseContext, ParseFileContext},
1111
language::{CrateName, CrateTypes, SupportedLanguage, SINGLE_FILE_CRATE_NAME},
1212
parser::ParsedData,
1313
RenameExt,
@@ -102,15 +102,17 @@ pub fn parse_input(
102102
file_name,
103103
crate_name,
104104
}| {
105-
let parsed_result = typeshare_core::parser::parse(
106-
&std::fs::read_to_string(&file_path)
105+
let parse_file_context = ParseFileContext {
106+
source_code: std::fs::read_to_string(&file_path)
107107
.with_context(|| format!("Failed to read input: {file_name}"))?,
108-
crate_name.clone(),
109-
file_name.clone(),
108+
crate_name: crate_name.clone(),
109+
file_name: file_name.clone(),
110110
file_path,
111-
parse_context,
112-
)
113-
.with_context(|| format!("Failed to parse: {file_name}"))?;
111+
};
112+
113+
let parsed_result =
114+
typeshare_core::parser::parse(parse_context, parse_file_context)
115+
.with_context(|| format!("Failed to parse: {file_name}"))?;
114116

115117
if let Some(parsed_data) = parsed_result {
116118
parsed_crates

core/src/context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ pub struct ParseContext<'a> {
1414
}
1515

1616
/// Parsing context for a single rust source file.
17-
pub struct ParseFileContext<'a> {
18-
pub source_code: &'a str,
17+
pub struct ParseFileContext {
18+
pub source_code: String,
1919
pub crate_name: CrateName,
2020
pub file_name: String,
2121
pub file_path: PathBuf,

core/src/parser.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{
2-
context::ParseContext,
2+
context::{ParseContext, ParseFileContext},
33
language::{CrateName, SupportedLanguage},
44
rename::RenameExt,
55
rust_types::{
@@ -16,7 +16,6 @@ use proc_macro2::Ident;
1616
use std::{
1717
collections::{BTreeSet, HashMap, HashSet},
1818
convert::TryFrom,
19-
path::PathBuf,
2019
};
2120
use syn::{
2221
ext::IdentExt, parse::ParseBuffer, punctuated::Punctuated, visit::Visit, Attribute, Expr,
@@ -163,23 +162,27 @@ impl ParsedData {
163162

164163
/// Parse the given Rust source string into `ParsedData`.
165164
pub fn parse(
166-
source_code: &str,
167-
crate_name: CrateName,
168-
file_name: String,
169-
file_path: PathBuf,
170165
parse_context: &ParseContext,
166+
parse_file_context: ParseFileContext,
171167
) -> Result<Option<ParsedData>, ParseError> {
172168
// We will only produce output for files that contain the `#[typeshare]`
173169
// attribute, so this is a quick and easy performance win
174-
if !source_code.contains("#[typeshare") {
170+
if !parse_file_context.source_code.contains("#[typeshare") {
175171
return Ok(None);
176172
}
177173

174+
let ParseFileContext {
175+
source_code,
176+
crate_name,
177+
file_name,
178+
file_path,
179+
} = parse_file_context;
180+
178181
debug!("parsing {file_name}");
179182
// Parse and process the input, ensuring we parse only items marked with
180183
// `#[typeshare]`
181-
let mut import_visitor = TypeShareVisitor::new(crate_name, file_name, file_path, parse_context);
182-
import_visitor.visit_file(&syn::parse_file(source_code)?);
184+
let mut import_visitor = TypeShareVisitor::new(parse_context, crate_name, file_name, file_path);
185+
import_visitor.visit_file(&syn::parse_file(&source_code)?);
183186

184187
Ok(import_visitor.parsed_data())
185188
}

core/src/visitors.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ pub struct TypeShareVisitor<'a> {
5757
impl<'a> TypeShareVisitor<'a> {
5858
/// Create an import visitor for a given crate name.
5959
pub fn new(
60+
parse_context: &'a ParseContext<'a>,
6061
crate_name: CrateName,
6162
file_name: String,
6263
file_path: PathBuf,
63-
parse_context: &'a ParseContext<'a>,
6464
) -> Self {
6565
Self {
6666
parsed_data: ParsedData::new(crate_name, file_name, parse_context.multi_file),
@@ -615,10 +615,10 @@ mod test {
615615

616616
let file: File = syn::parse_str(rust_code).unwrap();
617617
let mut visitor = TypeShareVisitor::new(
618+
&parse_context,
618619
"my_crate".into(),
619620
"my_file".into(),
620621
"file_path".into(),
621-
&parse_context,
622622
);
623623
visitor.visit_file(&file);
624624

core/tests/agnostic_tests.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::io::Write;
22
use typeshare_core::{
3-
context::ParseContext,
3+
context::{ParseContext, ParseFileContext},
44
language::{CrateTypes, Language, TypeScript},
55
parser::{self, ParseError},
66
rust_types::RustTypeParseError,
@@ -16,11 +16,13 @@ pub fn process_input(
1616
let parse_context = ParseContext::default();
1717

1818
let mut parsed_data = parser::parse(
19-
input,
20-
"default_name".into(),
21-
"file_name".into(),
22-
"file_path".into(),
2319
&parse_context,
20+
ParseFileContext {
21+
source_code: input.to_string(),
22+
crate_name: "default_name".into(),
23+
file_name: "file_name".into(),
24+
file_path: "file_path".into(),
25+
},
2426
)?
2527
.unwrap();
2628

core/tests/snapshot_tests.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ use std::{
1010
path::{Path, PathBuf},
1111
sync::Once,
1212
};
13-
use typeshare_core::{context::ParseContext, language::Language};
13+
use typeshare_core::{
14+
context::{ParseContext, ParseFileContext},
15+
language::Language,
16+
};
1417

1518
static TESTS_FOLDER_PATH: Lazy<PathBuf> =
1619
Lazy::new(|| PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("data/tests"));
@@ -103,11 +106,13 @@ fn check(
103106
};
104107

105108
let parsed_data = typeshare_core::parser::parse(
106-
&rust_input,
107-
"default_crate".into(),
108-
"file_name".into(),
109-
"file_path".into(),
110109
&parse_context,
110+
ParseFileContext {
111+
source_code: rust_input,
112+
crate_name: "default_crate".into(),
113+
file_name: "file_name".into(),
114+
file_path: "file_path".into(),
115+
},
111116
)?
112117
.unwrap();
113118
lang.generate_types(&mut typeshare_output, &HashMap::new(), parsed_data)?;

0 commit comments

Comments
 (0)