public static StatementSyntax BuildStatement(IEnumerable<IStatement> statements,
    IStatementBlock parent, WhitespaceKindLookup whitespaceLookup)
 {
     StatementSyntax statementBlock;
      var statementSyntaxList = statements
               .SelectMany(x => RDom.CSharp.GetSyntaxGroup(x))
               .ToList();
      var hasBlock = parent.HasBlock;
      if (hasBlock || statements.Count() > 1)
      {
     statementBlock = SyntaxFactory.Block(SyntaxFactory.List(statementSyntaxList));
     statementBlock = BuildSyntaxHelpers.AttachWhitespace(statementBlock, parent.Whitespace2Set, whitespaceLookup);
     // Block tokens are held in parent
      }
      else if (statements.Count() == 1)
      {
     statementBlock = (StatementSyntax)statementSyntaxList.First();
     //statementBlock = BuildSyntaxHelpers.AttachWhitespace(statementBlock, parent.Whitespace2Set, whitespaceLookup);
      }
      else
      {
     statementBlock = SyntaxFactory.EmptyStatement();
     statementBlock = BuildSyntaxHelpers.AttachWhitespace(statementBlock, parent.Whitespace2Set, whitespaceLookup);
      }
      return statementBlock;
 }
Пример #2
0
        public static StatementSyntax BuildStatement(IEnumerable <IStatement> statements,
                                                     IStatementBlock parent, WhitespaceKindLookup whitespaceLookup)
        {
            StatementSyntax statementBlock;
            var             statementSyntaxList = statements
                                                  .SelectMany(x => RDom.CSharp.GetSyntaxGroup(x))
                                                  .ToList();
            var hasBlock = parent.HasBlock;

            if (hasBlock || statements.Count() > 1)
            {
                statementBlock = SyntaxFactory.Block(SyntaxFactory.List(statementSyntaxList));
                statementBlock = BuildSyntaxHelpers.AttachWhitespace(statementBlock, parent.Whitespace2Set, whitespaceLookup);
                // Block tokens are held in parent
            }
            else if (statements.Count() == 1)
            {
                statementBlock = (StatementSyntax)statementSyntaxList.First();
                //statementBlock = BuildSyntaxHelpers.AttachWhitespace(statementBlock, parent.Whitespace2Set, whitespaceLookup);
            }
            else
            {
                statementBlock = SyntaxFactory.EmptyStatement();
                statementBlock = BuildSyntaxHelpers.AttachWhitespace(statementBlock, parent.Whitespace2Set, whitespaceLookup);
            }
            return(statementBlock);
        }
Пример #3
0
 private void ModifyStatement(IStatement ist, IStatementBlock isb)
 {
     if (isb is IfBlock)
     {
         IfBlock ib      = (IfBlock)isb;
         var     condVar = ib.ConditionVariable;
         if (!negatedConditionVariables.Contains(condVar))
         {
             if (condVar.definition != null)
             {
                 MethodInvoke mi = condVar.definition;
                 if (mi.method.Equals(new Func <int, int, bool>(Factor.AreEqual).Method))
                 {
                     if (mi.Arguments[1] is Variable)
                     {
                         Variable arg1 = (Variable)mi.Arguments[1];
                         if (arg1.IsObserved || arg1.IsLoopIndex)
                         {
                             // convert 'if(vbool1)' into 'if(x==value)'  where value is observed (or a loop index) and vbool1 is never negated.
                             // if vbool1 is negated, then we cannot make this substitution since we need to match the corresponding 'if(!vbool1)' condition.
                             IConditionStatement ics = (IConditionStatement)ist;
                             ics.Condition = Builder.BinaryExpr(mi.Arguments[0].GetExpression(), BinaryOperator.ValueEquality, arg1.GetExpression());
                         }
                     }
                 }
             }
         }
     }
 }
Пример #4
0
        public BreakStatement(IStatementBlock sourceBlock)
            : base(sourceBlock)
        {
            IStatementBlockLocalMember local     = null;
            IBreakTargetExitPoint      exitPoint = null;
            IDeclarationTarget         parent    = sourceBlock;

            //Search up for the block that needs the break.
            while (parent != null && local == null)
            {
                if (parent is IBreakTargetStatement)
                {
                    local     = ((IBreakTargetStatement)parent).BreakLocal;
                    exitPoint = ((IBreakTargetStatement)parent).ExitLabel;
                    ((IBreakTargetStatement)parent).UtilizeBreakMeasures = true;
                    break;
                }
                parent = parent.ParentTarget;
            }
            if (local == null && !(sourceBlock.Parent is ISwitchStatementCase))
            {
                throw new InvalidOperationException("Cannot insert a break into a non-terminable block.");
            }
            this.terminalVariable = local;
            this.exitSymbol       = exitPoint;
        }
Пример #5
0
 private ExpressionStatementNode BindExpressionStatement(IStatementBlock parent, Scanner <CommonTree> parentChildren)
 {
     return(CreateNode <ExpressionStatementNode>((SyntaxNode)parent, parentChildren, (node, children) =>
     {
         node.Expression = BindExpression(node, parentChildren);
     }));
 }
Пример #6
0
        private SyntaxNode BindStatement(IStatementBlock parent, Scanner <CommonTree> parentChildren)
        {
            var astType = parentChildren.Current.GetAstType();

            if (astType.ToAssignmentOperatorType() != AssignmentOperatorType.None)
            {
                return(BindAssignmentStatement(parent, parentChildren));
            }

            switch (astType)
            {
            case AstType.While:
                return(BindWhileStatement(parent, parentChildren));

            case AstType.If:
                return(BindIfStatement(parent, parentChildren));

            case AstType.Variable:
                return(BindDeclareStatement(parent, parentChildren));

            case AstType.Return:
                return(BindReturnStatement(parent, parentChildren));

            default:
                return(BindExpressionStatement(parent, parentChildren));
            }
        }
Пример #7
0
 public SwitchStatementCase(IStatementBlock parentBlock, IExpression firstCase)
 {
     if (firstCase == null)
     {
         throw new ArgumentNullException("firstCase");
     }
     this.parentBlock = parentBlock;
     this.Cases.Add(firstCase);
 }
Пример #8
0
 public void Dispose()
 {
     if (this.parentTarget == null || this.statements == null)
     {
         return;
     }
     this.parentTarget = null;
     this.statements.Dispose();
     this.statements = null;
 }
Пример #9
0
 public EnumeratorStatement(IStatementBlock sourceBlock)
     : base(sourceBlock)
 {
     enumMember                = this.Statements.Locals.AddNew(this.Statements.Locals.GetUnusedName("__enumerator"), typeof(IEnumerator).GetTypeReference());
     enumMember.AutoDeclare    = false;
     currentMember             = this.Statements.Locals.AddNew(this.Statements.Locals.GetUnusedName("__current"), typeof(void).GetTypeReference());
     currentMember.AutoDeclare = true;
     currentMemberInit         = new CastExpression(enumMember.GetReference().GetProperty("Current"), itemType);
     currentMember.InitializationExpression = currentMemberInit;
 }
Пример #10
0
        private WhileStatementNode BindWhileStatement(IStatementBlock parent, Scanner <CommonTree> parentChildren)
        {
            return(CreateNode <WhileStatementNode>((SyntaxNode)parent, parentChildren, (node, children) =>
            {
                children.Next();
                node.Expression = BindExpression(node, children);

                children.Next();
                BindStatementsToBlock(node, children);
            }));
        }
Пример #11
0
        private ReturnStatementNode BindReturnStatement(IStatementBlock parent, Scanner <CommonTree> parentChildren)
        {
            return(CreateNode <ReturnStatementNode>((SyntaxNode)parent, parentChildren, (node, children) =>
            {
                children.Next();

                if (!children.Done)
                {
                    node.ReturnValue = BindExpression(node, children);
                }
            }));
        }
Пример #12
0
        private AssignmentStatementNode BindAssignmentStatement(IStatementBlock parent, Scanner <CommonTree> parentChildren)
        {
            return(CreateNode <AssignmentStatementNode>((SyntaxNode)parent, parentChildren, (node, children) =>
            {
                node.Operation = node.CompilerNode.GetAstType().ToAssignmentOperatorType();

                children.Next();
                node.LeftValue = BindExpression(node, children);

                children.Next();
                node.RightValue = BindExpression(node, children);
            }));
        }
Пример #13
0
 public void Dispose()
 {
     if (this.isDisposed)
     {
         return;
     }
     if (this.statements != null)
     {
         this.statements.Dispose();
     }
     this.statements = null;
     isDisposed      = true;
 }
Пример #14
0
 public virtual void TranslateStatementBlock(IStatementBlock statementBlock)
 {
     foreach (IStatementBlockLocalMember isblm in statementBlock.Locals.Values)
     {
         if (isblm.AutoDeclare)
         {
             TranslateStatement(isblm.GetDeclarationStatement());
         }
     }
     foreach (IStatement ist in statementBlock)
     {
         this.TranslateStatement(ist);
     }
 }
Пример #15
0
        private IfStatementNode BindIfStatement(IStatementBlock parent, Scanner <CommonTree> parentChildren)
        {
            return(CreateNode <IfStatementNode>((SyntaxNode)parent, parentChildren, (node, children) =>
            {
                node.Bodies.Add(BindIfStatementBody(node, parentChildren));

                children.Next();
                children.Next();

                while (children.Next())
                {
                    node.Bodies.Add(BindIfStatementBody(node, children));
                }
            }));
        }
Пример #16
0
 public void Dispose()
 {
     if (this.statements != null)
     {
         this.Statements.Dispose();
         this.statements = null;
     }
     this.parentBlock   = null;
     this.lastIsDefault = false;
     if (this.definedLabelNames != null)
     {
         this.definedLabelNames.Clear();
         this.definedLabelNames = null;
     }
 }
Пример #17
0
        private DeclareStatementNode BindDeclareStatement(IStatementBlock parent, Scanner <CommonTree> parentChildren)
        {
            return(CreateNode <DeclareStatementNode>((SyntaxNode)parent, parentChildren, (node, children) =>
            {
                children.Next();
                node.TypeIdentifier = BindTypeIdentifier(node, children);

                children.Next();
                node.Identifier = BindIdentifier(node, children);

                if (children.Next())
                {
                    node.InitialValue = BindExpression(node, children);
                }
            }));
        }
Пример #18
0
 public SwitchStatementCase(IStatementBlock parentBlock, IExpressionCollection cases, bool lastIsDefault)
 {
     if (parentBlock == null)
     {
         throw new ArgumentNullException("parentBlock");
     }
     if (cases == null)
     {
         throw new ArgumentNullException("cases");
     }
     this.parentBlock   = parentBlock;
     this.lastIsDefault = lastIsDefault;
     foreach (IExpression expression in cases)
     {
         this.Cases.Add(expression);
     }
 }
Пример #19
0
        private void BindStatementsToBlock(IStatementBlock parent, Scanner <CommonTree> parentChildren)
        {
            if (parentChildren.Done)
            {
                return;
            }

            var blockChildren = new Scanner <CommonTree>(parentChildren.Current.GetChildren());

            while (blockChildren.Next())
            {
                var statement = BindStatement(parent, blockChildren);
                if (statement != null)
                {
                    parent.Statements.Add(statement);
                }
            }
        }
Пример #20
0
        public void InitializeStatements(IStatementBlock itemAsStatement, SyntaxNode syntaxNode, IDom parent, SemanticModel model)
        {
            if (syntaxNode == null)
            {
                return;
            }
            if (itemAsStatement == null)
            {
                return;
            }
            var blockSyntax = syntaxNode as BlockSyntax;

            if (blockSyntax != null)
            {
                itemAsStatement.StatementsAll.CreateAndAdd(blockSyntax.Statements, x => Corporation.Create(x, parent, model).Cast <IStatementAndDetail>());
                itemAsStatement.HasBlock = true;
                return;
            }
            var statementSyntax = syntaxNode as StatementSyntax;

            if (statementSyntax != null)
            {
                var statements = Corporation.Create(statementSyntax, parent, model).OfType <IStatementAndDetail>();
                if (statements.Count() > 1)
                {
                    throw new NotImplementedException();
                }
                var statement = statements.First();
                var statementAsBlockStatement = statement as IBlockStatement;
                if (statementAsBlockStatement != null)
                {
                    itemAsStatement.HasBlock = true;
                    foreach (var st in statementAsBlockStatement.Statements)
                    {
                        itemAsStatement.StatementsAll.AddOrMove(st);
                    }
                }
                else
                {
                    itemAsStatement.StatementsAll.AddOrMove(statement);
                }
            }
        }
Пример #21
0
 private static string GetName(IStatementBlock sourceBlock)
 {
     if (sourceBlock.Parent.DefinedLabelNames != null)
     {
         string baseName = "__exit";
         string itemName = baseName;
         int    i        = 0;
         while (sourceBlock.Parent.DefinedLabelNames.Contains(itemName))
         {
             i++;
             itemName = string.Format("{0}_{1}", baseName, i);
         }
         sourceBlock.Parent.DefinedLabelNames.Add(itemName);
         return(itemName);
     }
     else
     {
         return("__exit");
     }
 }
Пример #22
0
 public AssignStatement(IStatementBlock sourceBlock, IAssignStatementTarget reference, IExpression value)
     : base(sourceBlock)
 {
     this.reference = reference;
     this.value     = value;
 }
Пример #23
0
 internal SwitchStatementCases(IStatementBlock sourceBlock)
 {
     this.sourceBlock = sourceBlock;
 }
Пример #24
0
 protected Statement(IStatementBlock sourceBlock)
 {
     this.sourceBlock = sourceBlock;
 }
Пример #25
0
 public SwitchStatement(IStatementBlock sourceBlock)
     : base(sourceBlock)
 {
 }
Пример #26
0
 public BlockStatement(IStatementBlock sourceBlock)
     : base(sourceBlock)
 {
 }
Пример #27
0
 /// <summary>
 /// Creates a new <see cref="CommentStatement"/> with the <paramref name="comment"/>
 /// provided.
 /// </summary>
 /// <param name="comment">The comment represented by the <see cref="CommentStatement"/>.</param>
 public CommentStatement(string comment, IStatementBlock sourceBlock)
     : base(sourceBlock)
 {
     this.comment = comment;
 }
Пример #28
0
        //
        /// <summary>
        /// Returns a <see cref="String"/> that represents the current <see cref="Declaration{TParent, TDom}"/>.
        /// </summary>
        /// <returns>A <see cref="String"/> that represents the current <see cref="Declaration{TParent, TDom}"/>.</returns>
        public override string ToString()
        {
            if (this is IType)
            {
                return(((IType)this).GetTypeName(CodeGeneratorHelper.DefaultDomOptions));
            }

            List <string> members    = new List <string>();
            List <string> types      = new List <string>();
            List <string> nameSpaces = new List <string>();
            IDeclaration  current    = this;

            while (current != null)
            {
                if (current is INameSpaceDeclaration)
                {
                    nameSpaces.Add(current.GetUniqueIdentifier());
                }
                else if (current is IType)
                {
                    types.Add(current.GetUniqueIdentifier());
                }
                else if (current is IDeclaration)
                {
                    members.Add(current.GetUniqueIdentifier());
                }
                if (current.ParentTarget is IIntermediateProject)
                {
                    break;
                }
                if (current.ParentTarget is IStatementBlock)
                {
                    IStatementBlock statementBlock = ((IStatementBlock)current.ParentTarget);
                    if (statementBlock.Parent is IDeclaration)
                    {
                        current = (IDeclaration)statementBlock.Parent;
                        continue;
                    }
                    IBlockedStatement parent = (IBlockedStatement)statementBlock.Parent;

                    while (parent is IBlockedStatement)
                    {
                        if (parent.SourceBlock is IStatementBlock)
                        {
                            IStatementBlock currentBlock = ((IStatementBlock)parent.SourceBlock);
                            if (currentBlock.Parent is IBlockedStatement)
                            {
                                parent = (IBlockedStatement)((IStatementBlock)parent.SourceBlock).Parent;
                            }
                            else if (currentBlock.Parent is IDeclaration)
                            {
                                current = (IDeclaration)currentBlock.Parent;
                                break;
                            }
                            else if (currentBlock.Parent is IPropertyBodyMember)
                            {
                                current = ((IPropertyBodyMember)currentBlock.Parent).ParentTarget;
                                break;
                            }
                        }
                    }
                    continue;
                }
                current = (IDeclaration)current.ParentTarget;
            }
            members.Reverse();
            types.Reverse();
            nameSpaces.Reverse();
            if (members.Count > 0)
            {
                return(String.Format("{0}.{1}::{2}", String.Join(".", nameSpaces.ToArray()), String.Join("+", types.ToArray()), string.Join("]]", members.ToArray())));
            }
            else if (types.Count > 0)
            {
                return(String.Format("{0}.{1}", String.Join(".", nameSpaces.ToArray()), String.Join("+", types.ToArray())));
            }
            else
            {
                return(String.Format("{0}", String.Join(".", nameSpaces.ToArray())));
            }
        }
Пример #29
0
 public ReturnStatement(IStatementBlock sourceBlock)
     : base(sourceBlock)
 {
 }
Пример #30
0
 public ReturnStatement(IExpression result, IStatementBlock sourceBlock)
     : base(sourceBlock)
 {
     this.result = result;
 }
Пример #31
0
 public BreakableBlockedStatement(IStatementBlock sourceBlock)
     : base(sourceBlock)
 {
 }