コード例 #1
0
        public void Visit(JsWhileNode node)
        {
            if (node != null)
            {
                node.Index = NextOrderIndex;
                if (node.Condition != null)
                {
                    node.Condition.Accept(this);
                }

                if (node.Body != null)
                {
                    node.Body.Accept(this);
                }
            }
        }
コード例 #2
0
 public void Visit(JsWhileNode node)
 {
     // starts with 'while', so we don't care
 }
コード例 #3
0
 public void Visit(JsWhileNode node)
 {
     // starts with 'while', so we don't care
 }
コード例 #4
0
        private void DoWhileNode(JsWhileNode node)
        {
            // see if the condition is a constant
            if (m_parser.Settings.IsModificationAllowed(JsTreeModifications.EvaluateNumericExpressions))
            {
                var constantCondition = node.Condition as JsConstantWrapper;
                if (constantCondition != null)
                {
                    // TODO: (someday) we'd RATHER eliminate the statement altogether if the condition is always false,
                    // but we'd need to make sure var'd variables and declared functions are properly handled.
                    try
                    {
                        bool isTrue = constantCondition.ToBoolean();
                        if (isTrue)
                        {
                            // the condition is always true, so we should change it to 1
                            if (m_parser.Settings.IsModificationAllowed(JsTreeModifications.ChangeWhileToFor))
                            {
                                // the condition is always true; we should change it to a for(;;) statement.
                                // less bytes than while(1)

                                // check to see if we want to combine a preceding var with a for-statement
                                JsAstNode initializer = null;
                                if (m_parser.Settings.IsModificationAllowed(JsTreeModifications.MoveVarIntoFor))
                                {
                                    // if the previous statement is a var, we can move it to the initializer
                                    // and save even more bytes. The parent should always be a block. If not,
                                    // then assume there is no previous.
                                    var parentBlock = node.Parent as JsBlock;
                                    if (parentBlock != null)
                                    {
                                        int whileIndex = parentBlock.IndexOf(node);
                                        if (whileIndex > 0)
                                        {
                                            var previousVar = parentBlock[whileIndex - 1] as JsVar;
                                            if (previousVar != null)
                                            {
                                                initializer = previousVar;
                                                parentBlock.RemoveAt(whileIndex - 1);
                                            }
                                        }
                                    }
                                }

                                // create the for using our body and replace ourselves with it
                                var forNode = new JsForNode(node.Context, m_parser)
                                    {
                                        Initializer = initializer,
                                        Body = node.Body
                                    };
                                node.Parent.ReplaceChild(node, forNode);
                            }
                            else
                            {
                                // the condition is always true, so we can replace the condition
                                // with a 1 -- only one byte
                                node.Condition = new JsConstantWrapper(1, JsPrimitiveType.Number, null, m_parser);
                            }
                        }
                        else if (constantCondition.IsNotOneOrPositiveZero)
                        {
                            // the condition is always false, so we can replace the condition
                            // with a zero -- only one byte
                            node.Condition = new JsConstantWrapper(0, JsPrimitiveType.Number, null, m_parser);
                        }
                    }
                    catch (InvalidCastException)
                    {
                        // ignore any invalid cast exceptions
                    }
                }
            }
        }
コード例 #5
0
        public override void Visit(JsWhileNode node)
        {
            if (node != null)
            {
                // depth-first
                base.Visit(node);

                DoWhileNode(node);
            }
        }
コード例 #6
0
 public void Visit(JsWhileNode node)
 {
     // invalid! ignore
     IsValid = false;
 }
コード例 #7
0
 public void Visit(JsWhileNode node)
 {
     // invalid! ignore
     IsValid = false;
 }
コード例 #8
0
 public void Visit(JsWhileNode node)
 {
     // not applicable; terminate
 }
コード例 #9
0
 public void Visit(JsWhileNode node)
 {
     // not applicable; terminate
 }
コード例 #10
0
 public void Visit(JsWhileNode node)
 {
     Debug.Fail("shouldn't get here");
 }
コード例 #11
0
        public void Visit(JsWhileNode node)
        {
            if (node != null)
            {
                node.Index = NextOrderIndex;
                if (node.Condition != null)
                {
                    node.Condition.Accept(this);
                }

                if (node.Body != null)
                {
                    node.Body.Accept(this);
                }
            }
        }
コード例 #12
0
 public void Visit(JsWhileNode node)
 {
     Debug.Fail("shouldn't get here");
 }
コード例 #13
0
        public void Visit(JsWhileNode node)
        {
            if (node != null)
            {
                var symbol = StartSymbol(node);

                Output("while");
                SetContextOutputPosition(node.Context);
                if (m_settings.OutputMode == MinifierOutputMode.MultipleLines)
                {
                    OutputPossibleLineBreak(' ');
                }

                OutputPossibleLineBreak('(');
                m_startOfStatement = false;
                if (node.Condition != null)
                {
                    node.Condition.Accept(this);
                }
                OutputPossibleLineBreak(')');

                OutputBlock(node.Body);

                EndSymbol(symbol);
            }
        }
コード例 #14
0
        public override void Visit(JsWhileNode node)
        {
            if (node != null)
            {
                if (m_parser.Settings.StripDebugStatements
                     && m_parser.Settings.IsModificationAllowed(JsTreeModifications.StripDebugStatements)
                     && node.Body != null
                     && node.Body.IsDebuggerStatement)
                {
                    node.Body = null;
                }

                // recurse
                base.Visit(node);

                // if the body is now empty, make it null
                if (node.Body != null && node.Body.Count == 0)
                {
                    node.Body = null;
                }
            }
        }