Remove explicit string deriving code in favor of immediate

This commit is contained in:
Ayaz Hafiz 2022-07-13 10:42:30 -04:00
parent 9a66e936a8
commit 568e8d9475
No known key found for this signature in database
GPG Key ID: 0E2A37416A25EF58
3 changed files with 1 additions and 113 deletions

View File

@ -219,7 +219,6 @@ pub(crate) fn derive_to_encoder(
def_symbol: Symbol,
) -> DerivedBody {
let (body, body_type) = match key {
FlatEncodableKey::String => to_encoder_string(env, def_symbol),
FlatEncodableKey::List() => todo!(),
FlatEncodableKey::Set() => todo!(),
FlatEncodableKey::Dict() => todo!(),
@ -277,97 +276,6 @@ pub(crate) fn derive_to_encoder(
}
}
fn to_encoder_string(env: &mut Env<'_>, fn_name: Symbol) -> (Expr, Variable) {
// Build \s -> Encode.string s
use Expr::*;
let s_sym = env.new_symbol("s");
// build `Encode.string s` type
// Str -[uls]-> Encoder fmt | fmt has EncoderFormatting
let encode_string_fn_var = env.import_encode_symbol(Symbol::ENCODE_STRING);
// Str -[clos]-> t1
let string_var_slice = VariableSubsSlice::insert_into_subs(env.subs, once(Variable::STR)); // TODO: consider caching this singleton slice
let encode_string_clos_var = env.subs.fresh_unnamed_flex_var(); // clos
let encoder_var = env.subs.fresh_unnamed_flex_var(); // t1
let this_encode_string_fn_var = synth_var(
env.subs,
Content::Structure(FlatType::Func(
string_var_slice,
encode_string_clos_var,
encoder_var,
)),
);
// Str -[uls]-> Encoder fmt | fmt has EncoderFormatting
// ~ Str -[clos]-> t1
env.unify(encode_string_fn_var, this_encode_string_fn_var);
// Encode.string : Str -[clos]-> Encoder fmt | fmt has EncoderFormatting
let encode_string_var = AbilityMember(Symbol::ENCODE_STRING, None, encode_string_fn_var);
let encode_record_fn = Box::new((
encode_string_fn_var,
Loc::at_zero(encode_string_var),
encode_string_clos_var,
encoder_var,
));
// Encode.string s
let encode_string_call = Call(
encode_record_fn,
vec![(Variable::STR, Loc::at_zero(Var(s_sym)))],
CalledVia::Space,
);
// Encode.custom \bytes, fmt -> Encode.appendWith bytes (Encode.string s) fmt
let (body, this_encoder_var) =
wrap_in_encode_custom(env, encode_string_call, encoder_var, s_sym, Variable::STR);
// Create fn_var for ambient capture; we fix it up below.
let fn_var = synth_var(env.subs, Content::Error);
// -[fn_name]->
let fn_name_labels = UnionLambdas::insert_into_subs(env.subs, once((fn_name, vec![])));
let fn_clos_var = synth_var(
env.subs,
Content::LambdaSet(LambdaSet {
solved: fn_name_labels,
recursion_var: OptVariable::NONE,
unspecialized: SubsSlice::default(),
ambient_function: fn_var,
}),
);
// Str -[fn_name]-> (typeof Encode.record [ .. ] = Encoder fmt)
env.subs.set_content(
fn_var,
Content::Structure(FlatType::Func(
string_var_slice,
fn_clos_var,
this_encoder_var,
)),
);
// \rcd -[fn_name]-> Encode.record [ { key: .., value: .. }, .. ]
let clos = Closure(ClosureData {
function_type: fn_var,
closure_type: fn_clos_var,
return_type: this_encoder_var,
name: fn_name,
captured_symbols: vec![],
recursive: Recursive::NotRecursive,
arguments: vec![(
Variable::STR,
AnnotatedMark::known_exhaustive(),
Loc::at_zero(Pattern::Identifier(s_sym)),
)],
loc_body: Box::new(Loc::at_zero(body)),
});
(clos, fn_var)
}
fn to_encoder_record(
env: &mut Env<'_>,
record_var: Variable,

View File

@ -14,7 +14,6 @@ pub enum FlatEncodable {
#[derive(Hash, PartialEq, Eq, Debug, Clone)]
pub enum FlatEncodableKey {
String,
List(/* takes one variable */),
Set(/* takes one variable */),
Dict(/* takes two variables */),
@ -26,7 +25,6 @@ pub enum FlatEncodableKey {
impl FlatEncodableKey {
pub(crate) fn debug_name(&self) -> String {
match self {
FlatEncodableKey::String => "string".to_string(),
FlatEncodableKey::List() => "list".to_string(),
FlatEncodableKey::Set() => "set".to_string(),
FlatEncodableKey::Dict() => "dict".to_string(),

View File

@ -515,25 +515,7 @@ fn immediates() {
check_immediate(v!(DEC), Symbol::ENCODE_DEC);
check_immediate(v!(F32), Symbol::ENCODE_F32);
check_immediate(v!(F64), Symbol::ENCODE_F64);
}
#[test]
fn string() {
derive_test(v!(STR), |golden| {
assert_snapshot!(golden, @r###"
# derived for Str
# Str -[[toEncoder_string(0)]]-> Encoder fmt | fmt has EncoderFormatting
# Str -[[toEncoder_string(0)]]-> (List U8, fmt -[[custom(2) Str]]-> List U8) | fmt has EncoderFormatting
# Specialization lambda sets:
# @<1>: [[toEncoder_string(0)]]
# @<2>: [[custom(2) Str]]
#Derived.toEncoder_string =
\#Derived.s ->
Encode.custom \#Derived.bytes, #Derived.fmt ->
Encode.appendWith #Derived.bytes (Encode.string #Derived.s) #Derived.fmt
"###
)
})
check_immediate(v!(STR), Symbol::ENCODE_STRING);
}
#[test]