public static IEnumerable <SyntaxNode> BuildMethod(this RoslynTranslator roslynTranslator, IFunctionModel stack, IPortModel portModel) { roslynTranslator.ClearBuiltStacks(); var generatedName = roslynTranslator.MakeUniqueName(stack.CodeTitle); var methodSyntaxNode = RoslynBuilder.DeclareMethod( generatedName, AccessibilityFlags.Public, stack.ReturnType.Resolve(roslynTranslator.Stencil)); var localDeclarationNodes = BuildLocalDeclarations(roslynTranslator, stack); var argumentNodes = BuildArguments(roslynTranslator.Stencil, stack); methodSyntaxNode = methodSyntaxNode.WithParameterList(SyntaxFactory.ParameterList( SyntaxFactory.SeparatedList(argumentNodes.ToArray()))); methodSyntaxNode = methodSyntaxNode.WithBody(SyntaxFactory.Block(localDeclarationNodes.ToArray())); if (stack.EnableProfiling) { throw new NotImplementedException("BuildMethod Profiling not implemented"); // methodSyntaxNode = methodSyntaxNode.WithAdditionalAnnotations(InstrumentForProfiling.profilingAnnotation); } BlockSyntax stackBlock = SyntaxFactory.Block(); roslynTranslator.BuildStack(stack, ref stackBlock); foreach (var statement in stackBlock.Statements) { methodSyntaxNode = methodSyntaxNode.AddBodyStatements(statement); } yield return(methodSyntaxNode); }
public static IEnumerable <SyntaxNode> BuildForEach(this RoslynTranslator translator, ForEachHeaderModel forEachHeaderModelStatement, IPortModel portModel) { IPortModel loopExecutionInputPortModel = forEachHeaderModelStatement.InputPort; IPortModel insertLoopPortModel = loopExecutionInputPortModel?.ConnectionPortModels?.FirstOrDefault(); var insertLoopNodeModel = insertLoopPortModel?.NodeModel as IHasMainInputPort; IPortModel collectionInputPortModel = insertLoopNodeModel?.InputPort; if (collectionInputPortModel == null || !collectionInputPortModel.Connected || !collectionInputPortModel.DataType.IsVsArrayType(translator.Stencil)) { yield break; } var collectionName = translator.MakeUniqueName("Collection"); SyntaxNode collectionSyntax = translator.BuildPort(collectionInputPortModel).SingleOrDefault(); yield return(RoslynBuilder.DeclareLoopCollectionVariable(collectionSyntax, collectionName)); if (forEachHeaderModelStatement.IndexVariableDeclarationModel != null) { yield return(forEachHeaderModelStatement.IndexVariableDeclarationModel.DeclareLoopIndexVariable(-1)); } if (forEachHeaderModelStatement.CountVariableDeclarationModel != null) { var collectionInput = translator.BuildPort(collectionInputPortModel).SingleOrDefault() as ExpressionSyntax; yield return(forEachHeaderModelStatement.CountVariableDeclarationModel.DeclareLoopCountVariable( collectionInput, collectionName, translator)); } var forEachBlock = SyntaxFactory.Block(); foreach (var localDeclaration in BuildLocalDeclarations(translator, forEachHeaderModelStatement)) { forEachBlock = forEachBlock.AddStatements(localDeclaration); } if (forEachHeaderModelStatement.IndexVariableDeclarationModel != null) { forEachBlock = forEachBlock.AddStatements(SyntaxFactory.ExpressionStatement( SyntaxFactory.PostfixUnaryExpression( SyntaxKind.PostIncrementExpression, SyntaxFactory.IdentifierName(forEachHeaderModelStatement.IndexVariableDeclarationModel.name))) ); } translator.BuildStack(forEachHeaderModelStatement, ref forEachBlock, StackExitStrategy.Continue); var itemModel = forEachHeaderModelStatement.ItemVariableDeclarationModel; if (itemModel == null) { yield break; } yield return(SyntaxFactory.ForEachStatement( SyntaxFactory.IdentifierName("var"), SyntaxFactory.Identifier(itemModel.VariableName), SyntaxFactory.IdentifierName(collectionName), forEachBlock)); }