Пример #1
0
        public void InlineCommentAtEndOfCondition()
        {
            IfElseStatement condition = new IfElseStatement();

            condition.AddChild(new CSharpTokenNode(new TextLocation(1, 1)), IfElseStatement.IfKeywordRole);
            condition.AddChild(new CSharpTokenNode(new TextLocation(1, 4)), Roles.LPar);
            condition.AddChild(new IdentifierExpression("cond", new TextLocation(1, 5)), IfElseStatement.ConditionRole);
            condition.AddChild(new Comment(CommentType.MultiLine, new TextLocation(1, 9), new TextLocation(1, 14))
            {
                Content = "a"
            }, Roles.Comment);
            condition.AddChild(new CSharpTokenNode(new TextLocation(1, 14)), Roles.RPar);
            condition.AddChild(new ReturnStatement(), IfElseStatement.TrueRole);

            AssertOutput("if (cond/*a*/)\n$return;\n", condition);
        }
Пример #2
0
        public override void VisitIfElseStatement(IfElseStatement ifElseStatement)
        {
            ForceSpacesBefore(ifElseStatement.LParToken, policy.SpaceBeforeIfParentheses);

            ForceSpacesAfter(ifElseStatement.LParToken, policy.SpacesWithinIfParentheses);
            ForceSpacesBefore(ifElseStatement.RParToken, policy.SpacesWithinIfParentheses);

            if (!(ifElseStatement.Parent is IfElseStatement && ((IfElseStatement)ifElseStatement.Parent).FalseStatement == ifElseStatement))
            {
                FixStatementIndentation(ifElseStatement.StartLocation);
            }

            if (!ifElseStatement.Condition.IsNull)
            {
                ifElseStatement.Condition.AcceptVisitor(this);
            }

            if (!ifElseStatement.TrueStatement.IsNull)
            {
                FixEmbeddedStatment(policy.StatementBraceStyle, ifElseStatement.IfToken, policy.AllowIfBlockInline, ifElseStatement.TrueStatement);
            }

            if (!ifElseStatement.FalseStatement.IsNull)
            {
                var placeElseOnNewLine = policy.ElseNewLinePlacement;
                if (!(ifElseStatement.TrueStatement is BlockStatement))
                {
                    placeElseOnNewLine = NewLinePlacement.NewLine;
                }
                PlaceOnNewLine(placeElseOnNewLine, ifElseStatement.ElseToken);
                if (ifElseStatement.FalseStatement is IfElseStatement)
                {
                    PlaceOnNewLine(policy.ElseIfNewLinePlacement, ((IfElseStatement)ifElseStatement.FalseStatement).IfToken);
                }
                FixEmbeddedStatment(policy.StatementBraceStyle, ifElseStatement.ElseToken, policy.AllowIfBlockInline, ifElseStatement.FalseStatement, ifElseStatement.FalseStatement is IfElseStatement);
            }
        }
Пример #3
0
 void IAstVisitor.VisitIfElseStatement(IfElseStatement ifElseStatement)
 {
     Visit(EnterIfElseStatement, LeaveIfElseStatement, ifElseStatement);
 }
Пример #4
0
 public virtual S VisitIfElseStatement(IfElseStatement ifElseStatement, T data)
 {
     return(VisitChildren(ifElseStatement, data));
 }
Пример #5
0
 IEnumerable<Statement> TransformNode(ILNode node)
 {
     if (node is ILLabel) {
         yield return new Ast.LabelStatement { Label = ((ILLabel)node).Name }.WithAnnotation(node.ILRanges);
     } else if (node is ILExpression) {
         AstNode codeExpr = TransformExpression((ILExpression)node);
         if (codeExpr != null) {
             if (codeExpr is Ast.Expression) {
                 yield return new Ast.ExpressionStatement { Expression = (Ast.Expression)codeExpr };
             } else if (codeExpr is Ast.Statement) {
                 yield return (Ast.Statement)codeExpr;
             } else {
                 throw new Exception();
             }
         }
     } else if (node is ILWhileLoop) {
         ILWhileLoop ilLoop = (ILWhileLoop)node;
         Expression expr;
         WhileStatement whileStmt = new WhileStatement() {
             Condition = expr = ilLoop.Condition != null ? (Expression)TransformExpression(ilLoop.Condition) : new PrimitiveExpression(true),
             EmbeddedStatement = TransformBlock(ilLoop.BodyBlock)
         };
         expr.AddAnnotation(ilLoop.ILRanges);
         yield return whileStmt;
     } else if (node is ILCondition) {
         ILCondition conditionalNode = (ILCondition)node;
         bool hasFalseBlock = conditionalNode.FalseBlock.EntryGoto != null || conditionalNode.FalseBlock.Body.Count > 0;
         BlockStatement trueStmt;
         var ifElseStmt = new Ast.IfElseStatement {
             Condition = (Expression)TransformExpression(conditionalNode.Condition),
             TrueStatement = trueStmt = TransformBlock(conditionalNode.TrueBlock),
             FalseStatement = hasFalseBlock ? TransformBlock(conditionalNode.FalseBlock) : null
         };
         ifElseStmt.Condition.AddAnnotation(conditionalNode.ILRanges);
         if (ifElseStmt.FalseStatement == null)
             trueStmt.HiddenEnd = NRefactoryExtensions.CreateHidden(conditionalNode.FalseBlock.GetSelfAndChildrenRecursiveILRanges(), trueStmt.HiddenEnd);
         yield return ifElseStmt;
     } else if (node is ILSwitch) {
         ILSwitch ilSwitch = (ILSwitch)node;
         if (ilSwitch.Condition.InferredType.GetElementType() == ElementType.Boolean && (
             from cb in ilSwitch.CaseBlocks
             where cb.Values != null
             from val in cb.Values
             select val
         ).Any(val => val != 0 && val != 1))
         {
             // If switch cases contain values other then 0 and 1, force the condition to be non-boolean
             ilSwitch.Condition.ExpectedType = corLib.Int32;
         }
         SwitchStatement switchStmt = new SwitchStatement() { Expression = (Expression)TransformExpression(ilSwitch.Condition) };
         switchStmt.Expression.AddAnnotation(ilSwitch.ILRanges);
         switchStmt.HiddenEnd = NRefactoryExtensions.CreateHidden(ilSwitch.EndILRanges, switchStmt.HiddenEnd);
         foreach (var caseBlock in ilSwitch.CaseBlocks) {
             SwitchSection section = new SwitchSection();
             if (caseBlock.Values != null) {
                 section.CaseLabels.AddRange(caseBlock.Values.Select(i => new CaseLabel() { Expression = AstBuilder.MakePrimitive(i, (ilSwitch.Condition.ExpectedType ?? ilSwitch.Condition.InferredType).ToTypeDefOrRef()) }));
             } else {
                 section.CaseLabels.Add(new CaseLabel());
             }
             section.Statements.Add(TransformBlock(caseBlock));
             switchStmt.SwitchSections.Add(section);
         }
         yield return switchStmt;
     } else if (node is ILTryCatchBlock) {
         ILTryCatchBlock tryCatchNode = ((ILTryCatchBlock)node);
         var tryCatchStmt = new Ast.TryCatchStatement();
         tryCatchStmt.TryBlock = TransformBlock(tryCatchNode.TryBlock);
         tryCatchStmt.TryBlock.HiddenStart = NRefactoryExtensions.CreateHidden(tryCatchNode.ILRanges, tryCatchStmt.TryBlock.HiddenStart);
         foreach (var catchClause in tryCatchNode.CatchBlocks) {
             if (catchClause.ExceptionVariable == null
                 && (catchClause.ExceptionType == null || catchClause.ExceptionType.GetElementType() == ElementType.Object))
             {
                 tryCatchStmt.CatchClauses.Add(new Ast.CatchClause { Body = TransformBlock(catchClause) }.WithAnnotation(catchClause.StlocILRanges));
             } else {
                 tryCatchStmt.CatchClauses.Add(
                     new Ast.CatchClause {
                         Type = AstBuilder.ConvertType(catchClause.ExceptionType),
                         VariableNameToken = catchClause.ExceptionVariable == null ? null : Identifier.Create(catchClause.ExceptionVariable.Name).WithAnnotation(catchClause.ExceptionVariable.IsParameter ? TextTokenType.Parameter : TextTokenType.Local),
                         Body = TransformBlock(catchClause)
                     }.WithAnnotation(catchClause.ExceptionVariable).WithAnnotation(catchClause.StlocILRanges));
             }
         }
         if (tryCatchNode.FinallyBlock != null)
             tryCatchStmt.FinallyBlock = TransformBlock(tryCatchNode.FinallyBlock);
         if (tryCatchNode.FaultBlock != null) {
             CatchClause cc = new CatchClause();
             cc.Body = TransformBlock(tryCatchNode.FaultBlock);
             cc.Body.Add(new ThrowStatement()); // rethrow
             tryCatchStmt.CatchClauses.Add(cc);
         }
         yield return tryCatchStmt;
     } else if (node is ILFixedStatement) {
         ILFixedStatement fixedNode = (ILFixedStatement)node;
         FixedStatement fixedStatement = new FixedStatement();
         for (int i = 0; i < fixedNode.Initializers.Count; i++) {
             var initializer = fixedNode.Initializers[i];
             Debug.Assert(initializer.Code == ILCode.Stloc);
             ILVariable v = (ILVariable)initializer.Operand;
             VariableInitializer vi;
             fixedStatement.Variables.Add(vi =
                 new VariableInitializer {
                     NameToken = Identifier.Create(v.Name).WithAnnotation(v.IsParameter ? TextTokenType.Parameter : TextTokenType.Local),
                     Initializer = (Expression)TransformExpression(initializer.Arguments[0])
                 }.WithAnnotation(v));
             vi.AddAnnotation(ILRange.OrderAndJoin(initializer.GetSelfAndChildrenRecursiveILRanges()));
             if (i == 0)
                 vi.AddAnnotation(ILRange.OrderAndJoin(fixedNode.ILRanges));
         }
         fixedStatement.Type = AstBuilder.ConvertType(((ILVariable)fixedNode.Initializers[0].Operand).Type);
         fixedStatement.EmbeddedStatement = TransformBlock(fixedNode.BodyBlock);
         yield return fixedStatement;
     } else if (node is ILBlock) {
         yield return TransformBlock((ILBlock)node);
     } else {
         throw new Exception("Unknown node type");
     }
 }
 public static IfElseCondition IfElseCondition(NRefactory.IfElseStatement IfElseStatement, IScope scope, INRefcatoryExpressionVisitor visitor)
 {
     return(new IfElseCondition(IfElseStatement, scope, visitor));
 }
 public virtual S VisitIfElseStatement(IfElseStatement ifElseStatement, T data)
 {
     throw new NotImplementedException();
 }
Пример #8
0
 public override AstExpression VisitIfElseStatement(NRefactory.IfElseStatement ifElseStatement, IScope scope)
 {
     return(AstExpression.IfElseCondition(ifElseStatement, scope, this));
 }