Skip to content

Commit 5b0a85d

Browse files
WIP
1 parent 3c7f070 commit 5b0a85d

File tree

4 files changed

+816
-767
lines changed

4 files changed

+816
-767
lines changed

src/fast_check/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ mod range_finder;
1111
mod swc_helpers;
1212
#[cfg(feature = "fast_check")]
1313
mod transform;
14+
#[cfg(feature = "fast_check")]
15+
mod transform_dts;
1416

1517
#[cfg(feature = "fast_check")]
1618
pub use transform::FastCheckModule;

src/fast_check/swc_helpers.rs

+143
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
22

3+
use deno_ast::swc::ast::ArrayLit;
34
use deno_ast::swc::ast::Expr;
45
use deno_ast::swc::ast::Ident;
56
use deno_ast::swc::ast::Lit;
67
use deno_ast::swc::ast::MemberProp;
8+
use deno_ast::swc::ast::ObjectLit;
9+
use deno_ast::swc::ast::ParenExpr;
710
use deno_ast::swc::ast::Prop;
811
use deno_ast::swc::ast::PropName;
912
use deno_ast::swc::ast::PropOrSpread;
1013
use deno_ast::swc::ast::ReturnStmt;
1114
use deno_ast::swc::ast::Stmt;
15+
use deno_ast::swc::ast::TsAsExpr;
16+
use deno_ast::swc::ast::TsEntityName;
1217
use deno_ast::swc::ast::TsKeywordType;
1318
use deno_ast::swc::ast::TsKeywordTypeKind;
19+
use deno_ast::swc::ast::TsLit;
20+
use deno_ast::swc::ast::TsLitType;
1421
use deno_ast::swc::ast::TsType;
22+
use deno_ast::swc::ast::TsTypeAnn;
23+
use deno_ast::swc::ast::TsTypeOperator;
24+
use deno_ast::swc::ast::TsTypeOperatorOp;
25+
use deno_ast::swc::ast::TsTypeRef;
1526
use deno_ast::swc::common::DUMMY_SP;
1627

1728
pub fn ident(name: String) -> Ident {
@@ -187,3 +198,135 @@ fn is_keyword_type(return_type: &TsType, kind: TsKeywordTypeKind) -> bool {
187198
_ => false,
188199
}
189200
}
201+
202+
pub fn paren_expr(expr: Box<Expr>) -> Expr {
203+
Expr::Paren(ParenExpr {
204+
span: DUMMY_SP,
205+
expr,
206+
})
207+
}
208+
209+
pub fn any_type_ann() -> Box<TsTypeAnn> {
210+
type_ann(ts_keyword_type(TsKeywordTypeKind::TsAnyKeyword))
211+
}
212+
213+
pub fn ts_readonly(ann: TsType) -> TsType {
214+
TsType::TsTypeOperator(TsTypeOperator {
215+
span: DUMMY_SP,
216+
op: TsTypeOperatorOp::ReadOnly,
217+
type_ann: Box::new(ann),
218+
})
219+
}
220+
221+
pub fn unknown_type_ann() -> Box<TsTypeAnn> {
222+
Box::new(TsTypeAnn {
223+
span: DUMMY_SP,
224+
type_ann: Box::new(ts_keyword_type(TsKeywordTypeKind::TsUnknownKeyword)),
225+
})
226+
}
227+
228+
pub fn type_ann(ts_type: TsType) -> Box<TsTypeAnn> {
229+
Box::new(TsTypeAnn {
230+
span: DUMMY_SP,
231+
type_ann: Box::new(ts_type),
232+
})
233+
}
234+
235+
pub fn type_ref(name: String) -> TsTypeRef {
236+
TsTypeRef {
237+
span: DUMMY_SP,
238+
type_name: TsEntityName::Ident(Ident::new(name.into(), DUMMY_SP)),
239+
type_params: None,
240+
}
241+
}
242+
243+
pub fn ts_lit_type(lit: TsLit) -> TsType {
244+
TsType::TsLitType(TsLitType {
245+
lit,
246+
span: DUMMY_SP,
247+
})
248+
}
249+
250+
pub fn array_as_any_expr() -> Box<Expr> {
251+
expr_as_keyword_expr(
252+
Expr::Array(ArrayLit {
253+
span: DUMMY_SP,
254+
elems: Default::default(),
255+
}),
256+
TsKeywordTypeKind::TsAnyKeyword,
257+
)
258+
}
259+
260+
pub fn obj_as_any_expr() -> Box<Expr> {
261+
expr_as_keyword_expr(
262+
Expr::Object(ObjectLit {
263+
span: DUMMY_SP,
264+
props: Default::default(),
265+
}),
266+
TsKeywordTypeKind::TsAnyKeyword,
267+
)
268+
}
269+
270+
pub fn obj_as_never_expr() -> Box<Expr> {
271+
expr_as_keyword_expr(
272+
Expr::Object(ObjectLit {
273+
span: DUMMY_SP,
274+
props: Default::default(),
275+
}),
276+
TsKeywordTypeKind::TsNeverKeyword,
277+
)
278+
}
279+
280+
pub fn expr_as_keyword_expr(
281+
expr: Expr,
282+
keyword: TsKeywordTypeKind,
283+
) -> Box<Expr> {
284+
Box::new(Expr::TsAs(TsAsExpr {
285+
span: DUMMY_SP,
286+
expr: Box::new(expr),
287+
type_ann: Box::new(TsType::TsKeywordType(TsKeywordType {
288+
span: DUMMY_SP,
289+
kind: keyword,
290+
})),
291+
}))
292+
}
293+
294+
pub fn replacement_return_value(ty: &TsType) -> Option<Box<Expr>> {
295+
if is_void_type(ty) {
296+
None
297+
} else if is_never_type(ty) {
298+
Some(obj_as_never_expr())
299+
} else {
300+
Some(obj_as_any_expr())
301+
}
302+
}
303+
304+
pub fn regex_type() -> TsType {
305+
TsType::TsTypeRef(type_ref("RegExp".to_string()))
306+
}
307+
308+
pub fn maybe_lit_to_ts_type_const(lit: &Lit) -> Option<TsType> {
309+
match lit {
310+
Lit::Str(lit_str) => Some(ts_lit_type(TsLit::Str(lit_str.clone()))),
311+
Lit::Bool(lit_bool) => Some(ts_lit_type(TsLit::Bool(lit_bool.clone()))),
312+
Lit::Null(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsNullKeyword)),
313+
Lit::Num(lit_num) => Some(ts_lit_type(TsLit::Number(lit_num.clone()))),
314+
Lit::BigInt(lit_bigint) => {
315+
Some(ts_lit_type(TsLit::BigInt(lit_bigint.clone())))
316+
}
317+
Lit::Regex(_) => Some(regex_type()),
318+
Lit::JSXText(_) => None,
319+
}
320+
}
321+
322+
pub fn maybe_lit_to_ts_type(lit: &Lit) -> Option<TsType> {
323+
match lit {
324+
Lit::Str(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsStringKeyword)),
325+
Lit::Bool(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsBooleanKeyword)),
326+
Lit::Null(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsNullKeyword)),
327+
Lit::Num(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsNumberKeyword)),
328+
Lit::BigInt(_) => Some(ts_keyword_type(TsKeywordTypeKind::TsBigIntKeyword)),
329+
Lit::Regex(_) => Some(regex_type()),
330+
Lit::JSXText(_) => None,
331+
}
332+
}

0 commit comments

Comments
 (0)