1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using Uno . Compiler . API . Backends ;
4
+ using Uno . Compiler . API . Domain . AST . Members ;
5
+ using Uno . Compiler . API . Domain . AST . Statements ;
6
+ using Uno . Compiler . API . Domain . Graphics ;
7
+ using Uno . Compiler . API . Domain . IL ;
8
+ using Uno . Compiler . API . Domain . IL . Members ;
9
+ using Uno . Compiler . Core . Syntax . Compilers ;
10
+ using Uno . Compiler . Core . Syntax . Generators ;
11
+ using Uno . Logging ;
12
+
13
+ namespace Uno . Compiler . Core . Syntax . Builders
14
+ {
15
+ public class BuildQueue : LogObject
16
+ {
17
+ readonly BuildEnvironment _env ;
18
+ readonly Backend _backend ;
19
+ readonly Compiler _compiler ;
20
+ readonly List < BlockBase > _enqueuedBlocks = new List < BlockBase > ( ) ;
21
+ readonly List < KeyValuePair < AstMetaProperty , MetaProperty > > _enqueuedMetaProperties = new List < KeyValuePair < AstMetaProperty , MetaProperty > > ( ) ;
22
+ readonly HashSet < DataType > _enqueuedDrawClasses = new HashSet < DataType > ( ) ;
23
+ readonly List < FunctionCompiler > _enqueuedFunctions = new List < FunctionCompiler > ( ) ;
24
+ readonly List < Entity > _enqueuedAttributes = new List < Entity > ( ) ;
25
+ readonly List < DataType > _enqueuedTypes = new List < DataType > ( ) ;
26
+ readonly List < Action > _enqueuedActions = new List < Action > ( ) ;
27
+ int _assignBaseTypeIndex ;
28
+ int _populateMembersIndex ;
29
+
30
+ public BuildQueue ( Log log , BuildEnvironment env , Backend backend , Compiler compiler )
31
+ : base ( log )
32
+ {
33
+ _env = env ;
34
+ _backend = backend ;
35
+ _compiler = compiler ;
36
+ }
37
+
38
+ internal FunctionCompiler EnqueueFunction ( Function func , DataType parameterizedParent , AstScope body )
39
+ {
40
+ var fc = new FunctionCompiler ( _compiler , func , parameterizedParent , body ) ;
41
+ func . Tag = fc ;
42
+
43
+ if ( _env . IsGeneratingCode )
44
+ func . Stats |= EntityStats . CanLink ;
45
+ else if ( body != null )
46
+ _enqueuedFunctions . Add ( fc ) ;
47
+ else if ( _compiler . Backend . CanLink ( func ) )
48
+ func . Stats |= EntityStats . CanLink ;
49
+
50
+ return fc ;
51
+ }
52
+
53
+ internal void EnqueueDrawClass ( DataType declaringType )
54
+ {
55
+ _enqueuedDrawClasses . Add ( declaringType ) ;
56
+ }
57
+
58
+ internal void EnqueueType ( DataType dt , Action < DataType > assignBaseType , Action < DataType > populate )
59
+ {
60
+ if ( _env . IsGeneratingCode )
61
+ {
62
+ assignBaseType ( dt ) ;
63
+ populate ( dt ) ;
64
+ return ;
65
+ }
66
+
67
+ dt . AssigningBaseType = assignBaseType ;
68
+ dt . PopulatingMembers = x =>
69
+ {
70
+ populate ( x ) ;
71
+ x . Stats &= ~ EntityStats . PopulatingMembers ;
72
+ } ;
73
+ dt . Stats |= EntityStats . PopulatingMembers ;
74
+ _enqueuedTypes . Add ( dt ) ;
75
+ }
76
+
77
+ internal void EnqueueAttributes ( Entity e , Action < Entity > assign )
78
+ {
79
+ e . AssigningAttributes = assign ;
80
+ _enqueuedAttributes . Add ( e ) ;
81
+ }
82
+
83
+ internal void EnqueueAttributes ( Member e , DataType parameterizedParent , IReadOnlyList < AstAttribute > attributes )
84
+ {
85
+ if ( attributes . Count > 0 )
86
+ EnqueueAttributes ( e , x => e . SetAttributes ( _compiler . CompileAttributes ( parameterizedParent , attributes ) ) ) ;
87
+ }
88
+
89
+ public void BuildTypes ( )
90
+ {
91
+ for ( int count = 0 , j = 0 ; count != _enqueuedTypes . Count && j < 10 ; j ++ )
92
+ {
93
+ count = _enqueuedTypes . Count ;
94
+
95
+ while ( _assignBaseTypeIndex < count )
96
+ _enqueuedTypes [ _assignBaseTypeIndex ++ ] . AssignBaseType ( ) ;
97
+
98
+ for ( int i = 0 ; i < _enqueuedAttributes . Count ; i ++ )
99
+ _enqueuedAttributes [ i ] . AssignAttributes ( ) ;
100
+
101
+ _enqueuedAttributes . Clear ( ) ;
102
+
103
+ while ( _populateMembersIndex < count )
104
+ if ( _backend . CanLink ( _enqueuedTypes [ _populateMembersIndex ] ) )
105
+ _enqueuedTypes [ _populateMembersIndex ++ ] . Stats |= EntityStats . CanLink ;
106
+ else
107
+ _enqueuedTypes [ _populateMembersIndex ++ ] . PopulateMembers ( ) ;
108
+
109
+ for ( int i = 0 ; i < _enqueuedActions . Count ; i ++ )
110
+ _enqueuedActions [ i ] ( ) ;
111
+
112
+ _enqueuedActions . Clear ( ) ;
113
+ }
114
+
115
+ for ( ; _populateMembersIndex < _enqueuedTypes . Count ; _populateMembersIndex ++ )
116
+ Log . Warning ( _enqueuedTypes [ _populateMembersIndex ] . Source , ErrorCode . I0000 , "Unable to parameterize " + _enqueuedTypes [ _populateMembersIndex ] . Quote ( ) ) ;
117
+
118
+ _assignBaseTypeIndex = _populateMembersIndex ;
119
+ }
120
+
121
+ public void BuildTypesAndFunctions ( )
122
+ {
123
+ BuildTypes ( ) ;
124
+
125
+ for ( var i = 0 ; i < _enqueuedFunctions . Count ; i ++ )
126
+ {
127
+ _enqueuedFunctions [ i ] . Compile ( ) ;
128
+ BuildTypes ( ) ;
129
+ }
130
+
131
+ _enqueuedFunctions . Clear ( ) ;
132
+ _enqueuedTypes . Clear ( ) ;
133
+
134
+ _assignBaseTypeIndex = 0 ;
135
+ _populateMembersIndex = 0 ;
136
+ }
137
+
138
+ public void BuildEverything ( )
139
+ {
140
+ _compiler . BlockBuilder . FlattenTypes ( ) ;
141
+
142
+ do
143
+ {
144
+ BuildTypesAndFunctions ( ) ;
145
+ BuildBlocks ( ) ;
146
+ BuildMetaProperties ( ) ;
147
+
148
+ foreach ( var dt in _enqueuedDrawClasses )
149
+ DrawCallGenerator . GenerateDrawCalls ( _compiler , dt ) ;
150
+
151
+ _enqueuedDrawClasses . Clear ( ) ;
152
+
153
+ } while ( _enqueuedFunctions . Count > 0 ) ;
154
+ }
155
+
156
+ public void BuildBlocks ( )
157
+ {
158
+ for ( var i = 0 ; i < _enqueuedBlocks . Count ; i ++ )
159
+ if ( ! _enqueuedBlocks [ i ] . Source . Bundle . CanLink )
160
+ _enqueuedBlocks [ i ] . Populate ( ) ;
161
+
162
+ _enqueuedBlocks . Clear ( ) ;
163
+ }
164
+
165
+ internal void EnqueueBlock ( BlockBase b , Action < BlockBase > populate )
166
+ {
167
+ b . Populating = populate ;
168
+ _enqueuedBlocks . Add ( b ) ;
169
+ }
170
+
171
+ public void BuildMetaProperties ( )
172
+ {
173
+ for ( var i = 0 ; i < _enqueuedMetaProperties . Count ; i ++ )
174
+ _compiler . BlockBuilder . CompileMetaPropertyDefinitions ( _enqueuedMetaProperties [ i ] . Key , _enqueuedMetaProperties [ i ] . Value ) ;
175
+
176
+ _enqueuedMetaProperties . Clear ( ) ;
177
+ }
178
+
179
+ public void EnqueueMetaProperty ( AstMetaProperty ast , MetaProperty result )
180
+ {
181
+ _enqueuedMetaProperties . Add ( new KeyValuePair < AstMetaProperty , MetaProperty > ( ast , result ) ) ;
182
+ }
183
+
184
+ internal void Enqueue ( Action action )
185
+ {
186
+ _enqueuedActions . Add ( action ) ;
187
+ }
188
+ }
189
+ }
0 commit comments