Avoid growing type parameters in Visitor
commit896a986203789afb1ce75af19bb451290c795927
authorSteve Cao <shiqicao@fb.com>
Mon, 9 Mar 2020 20:19:20 +0000 (9 13:19 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Mon, 9 Mar 2020 20:33:21 +0000 (9 13:33 -0700)
treedb9e8cab6d8c49e4760e11dab43e95a3c1620891
parent5bf8507a8127f06330655ab83ec2a289d95aeec6
Avoid growing type parameters in Visitor

Summary:
`Visitor`, `Node` carries a list of type parameters, currently there are six, `Context`, `Error` and four aast annotations.

The long list of type parameters has lots of disadvantage,
1. Adding a new type parameters requires `O(n)` updates, `n` is number of all visitors,
2. Each visitor contains a lots boilerplate code,
3. Readability is compromised.

This diff reduces `n` type parameters to 1.

```
pub trait Params {
    type Context;
    type Error;
    type Ex;
    type Fb;
    type En;
    type Hi;
}
```

```
pub trait Node<P: Params> {
    fn accept(&self, ctx: &mut P::Context, v: &mut dyn Visitor<P = P>) -> Result<(), P::Error> {
        self.recurse(ctx, v)
    }
    fn recurse(&self, ctx: &mut P::Context, v: &mut dyn Visitor<P = P>) -> Result<(), P::Error> {
        Ok(())
    }
}
```

```
pub trait Visitor {
    type P: Params;

    ......

    fn visit_fun(
        &mut self,
        c: &mut <Self::P as Params>::Context,
        p: &Fun<<Self::P as Params>::Fb>,
    ) -> Result<(), <Self::P as Params>::Error> {
        p.recurse(c, self.object())
    }
}
```

Reviewed By: dabek

Differential Revision: D20333342

fbshipit-source-id: 7d8db5144a00a5113dfd5c8967dec753f646571d
26 files changed:
hphp/hack/src/hh_codegen/gen_visitor/gen_helper.rs
hphp/hack/src/hh_codegen/gen_visitor/mod.rs
hphp/hack/src/hh_codegen/gen_visitor/node_impl_generator.rs
hphp/hack/src/hh_codegen/gen_visitor/node_trait_generator.rs
hphp/hack/src/hh_codegen/gen_visitor/run.rs
hphp/hack/src/hh_codegen/gen_visitor/type_params_generator.rs [new file with mode: 0644]
hphp/hack/src/hh_codegen/gen_visitor/visitor_trait_generator.rs
hphp/hack/src/hhbc/ast_constant_folder.rs
hphp/hack/src/hhbc/closure_convert.rs
hphp/hack/src/hhbc/decl_vars.rs
hphp/hack/src/hhbc/emit_expression.rs
hphp/hack/src/hhbc/emit_param.rs
hphp/hack/src/hhbc/emit_pu.rs
hphp/hack/src/hhbc/generator.rs
hphp/hack/src/naming/elaborate_namespaces_visitor.rs
hphp/hack/src/oxidized/aast_visitor/mod.rs
hphp/hack/src/oxidized/aast_visitor/node.rs
hphp/hack/src/oxidized/aast_visitor/node_impl.rs
hphp/hack/src/oxidized/aast_visitor/node_impl_gen.rs
hphp/hack/src/oxidized/aast_visitor/node_mut.rs
hphp/hack/src/oxidized/aast_visitor/node_mut_impl_gen.rs [copied from hphp/hack/src/oxidized/aast_visitor/node_impl_gen.rs with 51% similarity]
hphp/hack/src/oxidized/aast_visitor/type_params.rs [new file with mode: 0644]
hphp/hack/src/oxidized/aast_visitor/visitor.rs
hphp/hack/src/oxidized/aast_visitor/visitor_mut.rs
hphp/hack/src/parser/aast_check.rs
hphp/hack/src/parser/lowerer.rs