@@ -165,71 +165,162 @@ void ProcessClasses(YNamespace @namespace, NamespaceDeclarationSyntax inputNames
165165
166166 // Body:
167167
168- var block = new YBlock ( ) ;
168+ method . Visibility = inputMethod . Modifiers . GetYVisibility ( ) ;
169+ method . Body = ProcessStatement ( inputMethod . Body ) ;
170+ @class . AddChild ( method ) ;
171+ }
172+ }
173+ }
169174
170- foreach ( var s in inputMethod . Body . Statements ) {
171- if ( s is ReturnStatementSyntax ) { // return
172- var returnStatement = ( ReturnStatementSyntax ) s ;
173- YExpr returnExpression = null ;
175+ // todo here could be generics or reflection
174176
175- if ( returnStatement . Expression is IdentifierNameSyntax ) {
176- returnExpression = new YIdentifierExpr ( ( IdentifierNameSyntax ) returnStatement . Expression ) ;
177- } else {
178- //throw new TUnsupportedException();
179- }
177+ YStatement ProcessStatement ( StatementSyntax statement )
178+ {
179+ if ( statement is IfStatementSyntax ) {
180+ return ProcessStatement ( ( IfStatementSyntax ) statement ) ;
181+ } else if ( statement is BlockSyntax ) {
182+ return ProcessStatement ( ( BlockSyntax ) statement ) ;
183+ } else if ( statement is ReturnStatementSyntax ) {
184+ return ProcessStatement ( ( ReturnStatementSyntax ) statement ) ;
185+ } else if ( statement is ExpressionStatementSyntax ) {
186+ return ProcessStatement ( ( ExpressionStatementSyntax ) statement ) ;
187+ }
180188
181- if ( returnExpression != null ) {
182- block . Statements . Add ( new YReturn ( returnExpression ) ) ;
183- }
189+ throw new TException ( "Unable to process statement" ) ;
190+ }
184191
185- } else if ( s is ExpressionStatementSyntax ) { // assignment
186- var expressionStatement = ( ExpressionStatementSyntax ) s ;
192+ YExpr ProcessExpr ( ExpressionSyntax expr )
193+ {
194+ if ( expr is BinaryExpressionSyntax ) {
195+ return ProcessExpr ( ( BinaryExpressionSyntax ) expr ) ;
196+ } else if ( expr is IdentifierNameSyntax ) {
197+ return ProcessExpr ( ( IdentifierNameSyntax ) expr ) ;
198+ } else if ( expr is LiteralExpressionSyntax ) {
199+ return ProcessExpr ( ( LiteralExpressionSyntax ) expr ) ;
200+ } else if ( expr is PrefixUnaryExpressionSyntax ) {
201+ return ProcessExpr ( ( PrefixUnaryExpressionSyntax ) expr ) ;
202+ } else if ( expr is InvocationExpressionSyntax ) {
203+ return ProcessExpr ( ( InvocationExpressionSyntax ) expr ) ;
204+ } else if ( expr is MemberAccessExpressionSyntax ) {
205+ return ProcessExpr ( ( MemberAccessExpressionSyntax ) expr ) ;
206+ } else if ( expr is ThisExpressionSyntax ) {
207+ return ProcessExpr ( ( ThisExpressionSyntax ) expr ) ;
208+ }
187209
188- if ( expressionStatement . Expression is AssignmentExpressionSyntax ) {
189- var assignmentExpression = ( AssignmentExpressionSyntax ) expressionStatement . Expression ;
210+ throw new TException ( "Unable to process expression" ) ;
211+ }
190212
191- YExpr left = null ;
213+ YExpr ProcessExpr ( IdentifierNameSyntax expr )
214+ {
215+ return new YIdentifierExpr ( expr ) ;
216+ }
192217
193- if ( assignmentExpression . Left is MemberAccessExpressionSyntax ) {
194- var memberAccessExpression = ( MemberAccessExpressionSyntax ) assignmentExpression . Left ;
218+ YExpr ProcessExpr ( LiteralExpressionSyntax expr )
219+ {
220+ if ( expr . Token . IsKind ( SyntaxKind . NullKeyword ) ) {
221+ return YLiteralExpr . Null ;
222+ } else if ( expr . Token . IsKind ( SyntaxKind . NumericLiteralToken ) ) {
223+ return new YLiteralExpr ( expr . Token . Value ) ; // looks same as YConstExpr
224+ }
195225
196- YExpr expr = null ;
226+ throw new TException ( "Unable to process expr" ) ;
227+ }
197228
198- if ( memberAccessExpression . Expression is ThisExpressionSyntax ) {
199- expr = YExpr . This ;
200- }
229+ YExpr ProcessExpr ( PrefixUnaryExpressionSyntax expr )
230+ {
231+ var operand = ProcessExpr ( expr . Operand ) ;
232+ var @operator = ProcessOperator ( expr . OperatorToken ) ;
201233
202- left = new YMemberAccessExpr (
203- expr ,
204- memberAccessExpression . Name . Identifier . ToString ( )
205- ) ;
206- } else if ( assignmentExpression . Left is IdentifierNameSyntax ) {
207- left = new YIdentifierExpr ( ( IdentifierNameSyntax ) assignmentExpression . Left ) ;
208- }
234+ return new YPrefixUnaryExpr ( @operator , operand ) ;
235+ }
209236
210- YExpr right = null ;
237+ YExpr ProcessExpr ( MemberAccessExpressionSyntax memberAccessExpression )
238+ {
239+ YExpr expr = ProcessExpr ( memberAccessExpression . Expression ) ;
211240
212- if ( assignmentExpression . Right is IdentifierNameSyntax ) {
213- right = new YIdentifierExpr ( ( IdentifierNameSyntax ) assignmentExpression . Right ) ;
214- }
241+ return new YMemberAccessExpr (
242+ expr ,
243+ memberAccessExpression . Name . Identifier . ToString ( )
244+ ) ;
245+ }
215246
216- if ( left != null && right != null ) {
217- block . Statements . Add ( new YAssign ( left , right ) ) ;
218- }
219- } else {
220- //throw new TUnsupportedException();
221- }
247+ YExpr ProcessExpr ( ThisExpressionSyntax expr )
248+ {
249+ return YExpr . This ;
250+ }
222251
223- } else {
224- //throw new TUnsupportedException();
225- }
226- }
252+ YExpr ProcessExpr ( InvocationExpressionSyntax expr )
253+ {
254+ if ( expr . ArgumentList . ChildNodes ( ) . Count ( ) > 0 ) {
255+ throw new TException ( "Unable to process expression" ) ;
256+ }
227257
228- method . Visibility = inputMethod . Modifiers . GetYVisibility ( ) ;
229- method . Body = block ;
230- @class . AddChild ( method ) ;
258+ return new YInvocation ( ProcessExpr ( expr . Expression ) ) ;
259+ }
260+
261+ YExpr ProcessExpr ( BinaryExpressionSyntax binaryExpression )
262+ {
263+ var left = ProcessExpr ( binaryExpression . Left ) ;
264+ var right = ProcessExpr ( binaryExpression . Right ) ;
265+ var operation = ProcessOperator ( binaryExpression . OperatorToken ) ;
266+
267+ return new YBinaryExpr ( left , right , operation ) ;
268+ }
269+
270+ YStatement ProcessStatement ( IfStatementSyntax ifStatement )
271+ {
272+ YExpr condition = ProcessExpr ( ifStatement . Condition ) ;
273+ YStatement statement = ProcessStatement ( ifStatement . Statement ) ;
274+ YStatement elseStatement = ProcessStatement ( ifStatement . Else . Statement ) ;
275+
276+ if ( condition != null && statement != null ) {
277+ return new YIf ( condition , statement , elseStatement ) ;
278+ }
279+
280+ throw new TException ( "Unable to process statement" ) ;
281+ }
282+
283+ YStatement ProcessStatement ( ReturnStatementSyntax statement )
284+ {
285+ return new YReturn ( ProcessExpr ( statement . Expression ) ) ;
286+ }
287+
288+ YStatement ProcessStatement ( BlockSyntax statement )
289+ {
290+ var block = new YBlock ( ) ;
291+
292+ foreach ( var s in statement . Statements ) {
293+ block . Statements . Add ( ProcessStatement ( s ) ) ;
294+ }
295+
296+ return block ;
297+ }
298+
299+ YStatement ProcessStatement ( ExpressionStatementSyntax statement )
300+ {
301+ if ( statement . Expression is AssignmentExpressionSyntax ) { // ?!
302+ var assignmentExpression = ( AssignmentExpressionSyntax ) statement . Expression ;
303+
304+ YExpr left = ProcessExpr ( assignmentExpression . Left ) ;
305+ YExpr right = ProcessExpr ( assignmentExpression . Right ) ;
306+
307+ if ( left != null && right != null ) {
308+ return new YAssign ( left , right ) ; // expression or statement?!
231309 }
232310 }
311+
312+ throw new TException ( "Unable to process statement" ) ;
313+ }
314+
315+ YOperator ProcessOperator ( SyntaxToken token )
316+ {
317+ if ( token . IsKind ( SyntaxKind . EqualsEqualsToken ) ) {
318+ return YOperator . EqualsEquals ;
319+ } else if ( token . IsKind ( SyntaxKind . MinusToken ) ) {
320+ return YOperator . Minus ;
321+ }
322+
323+ throw new TException ( "Unable to process opeartion" ) ;
233324 }
234325 }
235326
0 commit comments