1
- import deindent from '../../../utils/deindent.js' ;
2
- import CodeBuilder from '../../../utils/CodeBuilder.js' ;
3
- import visit from '../visit.js' ;
4
- import addComponentAttributes from './attributes/addComponentAttributes.js' ;
1
+ import deindent from '../../../../utils/deindent.js' ;
2
+ import CodeBuilder from '../../../../utils/CodeBuilder.js' ;
3
+ import visit from '../../visit.js' ;
4
+ import visitAttribute from './Attribute.js' ;
5
+ import visitEventHandler from './EventHandler.js' ;
6
+ import visitBinding from './Binding.js' ;
7
+ import visitRef from './Ref.js' ;
5
8
6
9
function capDown ( name ) {
7
10
return `${ name [ 0 ] . toLowerCase ( ) } ${ name . slice ( 1 ) } ` ;
@@ -19,16 +22,37 @@ function stringifyProps ( props ) {
19
22
return `{ ${ joined } }` ;
20
23
}
21
24
25
+ const order = {
26
+ Attribute : 1 ,
27
+ EventHandler : 2 ,
28
+ Binding : 3 ,
29
+ Ref : 4
30
+ } ;
31
+
32
+ const visitors = {
33
+ Attribute : visitAttribute ,
34
+ EventHandler : visitEventHandler ,
35
+ Binding : visitBinding ,
36
+ Ref : visitRef
37
+ } ;
38
+
22
39
export default function visitComponent ( generator , block , state , node ) {
23
40
const hasChildren = node . children . length > 0 ;
24
41
const name = block . getUniqueName ( capDown ( node . name === ':Self' ? generator . name : node . name ) ) ;
25
42
43
+ const childState = Object . assign ( { } , state , {
44
+ parentNode : null
45
+ } ) ;
46
+
26
47
const local = {
27
48
name,
28
49
namespace : state . namespace ,
29
50
isComponent : true ,
30
51
31
52
allUsedContexts : [ ] ,
53
+ staticAttributes : [ ] ,
54
+ dynamicAttributes : [ ] ,
55
+ bindings : [ ] ,
32
56
33
57
create : new CodeBuilder ( ) ,
34
58
update : new CodeBuilder ( )
@@ -38,7 +62,11 @@ export default function visitComponent ( generator, block, state, node ) {
38
62
39
63
generator . hasComponents = true ;
40
64
41
- addComponentAttributes ( generator , block , node , local ) ;
65
+ node . attributes
66
+ . sort ( ( a , b ) => order [ a . type ] - order [ b . type ] )
67
+ . forEach ( attribute => {
68
+ visitors [ attribute . type ] ( generator , block , childState , node , attribute , local ) ;
69
+ } ) ;
42
70
43
71
if ( local . allUsedContexts . length ) {
44
72
const initialProps = local . allUsedContexts . map ( contextName => {
@@ -81,10 +109,6 @@ export default function visitComponent ( generator, block, state, node ) {
81
109
name : generator . getUniqueName ( `create_${ name } _yield_fragment` ) // TODO should getUniqueName happen inside Fragment? probably
82
110
} ) ;
83
111
84
- const childState = Object . assign ( { } , state , {
85
- parentNode : null
86
- } ) ;
87
-
88
112
node . children . forEach ( child => {
89
113
visit ( generator , childBlock , childState , child ) ;
90
114
} ) ;
0 commit comments