Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit419ce8f

Browse files
committed
Working on React Component prop types generation
1 parentace9ccd commit419ce8f

File tree

2 files changed

+68
-3
lines changed

2 files changed

+68
-3
lines changed

‎2/generateReason.re‎

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@ let extractName = identifier =>
88
|DotTyped.UnknownIdentifier=>"Unknown"
99
};
1010

11-
letextractTypeName= identifier=>
12-
identifier|. extractName|.Js.String.toLowerCase;
11+
letextractTypeName= identifier=> {
12+
letname= extractName(identifier);
13+
letfirst=Js.String.get(name,0);
14+
letrest=Js.String.sliceToEnd(~from=1, name);
15+
Js.String.toLowerCase(first)++ rest;
16+
};
1317

1418
letextractModuleName= identifier=> {
1519
letname= extractName(identifier);
@@ -46,7 +50,34 @@ let rec compile = (~moduleName=?, moduleDefinition) =>
4650
Array.map(declarations, compile(~moduleName=extractName(name)));
4751
Js.Array.joinWith("\n", declarations);
4852

49-
|DotTyped.ReactComponent({name})=>
53+
|DotTyped.ReactComponent({name, type_:DotTyped.Object(propTypes)})=>
54+
Rabel.module_(
55+
extractModuleName(name),
56+
[|
57+
Rabel.Decorators.bsModule(
58+
~module_=Option.getExn(moduleName),
59+
Rabel.external_(
60+
"reactClass",
61+
"ReasonReact.reactClass",
62+
extractName(name),
63+
),
64+
),
65+
Rabel.let_(
66+
"make",
67+
Rabel.function_(
68+
Array.concat(
69+
Array.map(propTypes.properties, prop=>
70+
(extractName(prop.name),true,Some("?"))
71+
),
72+
[|("children",false,None)|],
73+
),
74+
"10",
75+
),
76+
),
77+
|],
78+
)
79+
80+
|DotTyped.ReactComponent({name, type_:DotTyped.Named(propTypesName)})=>
5081
Rabel.module_(
5182
extractModuleName(name),
5283
[|
@@ -58,6 +89,13 @@ let rec compile = (~moduleName=?, moduleDefinition) =>
5889
extractName(name),
5990
),
6091
),
92+
Rabel.let_(
93+
"make",
94+
Rabel.function_(
95+
Array.concat([||],[|("children",false,None)|]),
96+
extractModuleName(propTypesName)++".t",
97+
),
98+
),
6199
|],
62100
)
63101

‎2/rabel.re‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
openBelt;
22

33
moduleAst= {
4+
/** Applies a method with arguments.*/
45
letapply= (func:string, args:array(string))=>
56
func++"("++Js.Array.joinWith(",", args)++")";
67

8+
/** Decorates a block with a decorator.*/
79
letdecorate= (decorator:string, statement:string)=>
810
"[@"++ decorator++"] "++ statement;
911
};
1012

1113
moduleDecorators= {
14+
/** Marks a block with [@bs.optional].*/
1215
letbsOptional=Ast.decorate("bs.optional");
16+
17+
/** Marks a block with [@bs.as "name"].*/
1318
letbsAs= name=>Ast.decorate("bs.as\""++ name++"\"");
19+
20+
/** Marks a block with [@bs.module "name"].*/
1421
letbsModule= (~module_=?, statement)=> {
1522
letdecorator=
1623
switch (module_) {
@@ -19,10 +26,13 @@ module Decorators = {
1926
};
2027
Ast.decorate(decorator, statement);
2128
};
29+
30+
/** Marks a block with [@bs.deriving value].*/
2231
letbsDeriving= deriving=>Ast.decorate("bs.deriving "++ deriving);
2332
};
2433

2534
moduleTypes= {
35+
/** Creates a Reason record type. ts is (key, value, optional).*/
2636
letrecord_= ts=> {
2737
letfields=
2838
Array.map(
@@ -40,6 +50,7 @@ module Types = {
4050
"{ "++Js.Array.joinWith("", fields)++"}";
4151
};
4252

53+
/** Creates a JS object type. ts is (key, value).*/
4354
letjsRecord= ts=> {
4455
letfields=
4556
Array.map(ts, ((name, t))=>"\""++ name++"\": "++ t++", ");
@@ -101,3 +112,19 @@ let type_ = (name, t) => "type " ++ name ++ " = " ++ t ++ ";";
101112

102113
letexternal_= (name, type_, exported)=>
103114
"external "++ name++" : "++ type_++" = "++"\""++ exported++"\";";
115+
116+
letlet_= (name, value)=>"let "++ name++" = "++ value++";";
117+
118+
/** Creates a function. ts is (name, labeled, default).*/
119+
letfunction_= (ts, returnValue)=> {
120+
letparamStrs=
121+
Array.map(ts, param=>
122+
switch (param) {
123+
| (name,false,_)=> name
124+
| (name,true,None)=>"~"++ name
125+
| (name,true,Some(value))=>"~"++ name++"="++ value
126+
}
127+
);
128+
letparams=Js.Array.joinWith(", ", paramStrs);
129+
"("++ params++") => {"++ returnValue++"}";
130+
};

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp