Esempio n. 1
0
            public override void VisitVariableDeclarationStatement(VariableDeclarationStatement varDecl)
            {
                base.VisitVariableDeclarationStatement(varDecl);
                if (varDecl.Modifiers.HasFlag(Modifiers.Const) || varDecl.Role == ForStatement.InitializerRole)
                {
                    return;
                }
                if (varDecl.Variables.Count() > 1)
                {
                    return;
                }
                if (varDecl.Variables.Any(v => !(ctx.Resolve(v.Initializer) is ConstantResolveResult)))
                {
                    return;
                }
                var containingBlock = varDecl.GetParent <BlockStatement> ();

                if (containingBlock == null)
                {
                    return;
                }

                var returnTypeRR = ctx.Resolve(varDecl.Type);

                if (returnTypeRR.Type.IsReferenceType.HasValue && returnTypeRR.Type.IsReferenceType.Value)
                {
                    return;
                }

                var vr = ctx.Resolve(varDecl.Variables.First()) as LocalResolveResult;

                if (vr == null)
                {
                    return;
                }
                var assignmentAnalysis = new VariableUsageAnalyzation(ctx);

                containingBlock.AcceptVisitor(assignmentAnalysis);

                if (assignmentAnalysis.GetStatus(vr.Variable) == VariableState.Changed)
                {
                    return;
                }
                AddIssue(
                    varDecl.Variables.First().NameToken,
                    ctx.TranslateString("Convert to constant"),
                    ctx.TranslateString("To const"),
                    script => {
                    var constVarDecl        = (VariableDeclarationStatement)varDecl.Clone();
                    constVarDecl.Modifiers |= Modifiers.Const;
                    script.Replace(varDecl, constVarDecl);
                }
                    );
            }
            public override void VisitVariableDeclarationStatement(VariableDeclarationStatement varDecl)
            {
                base.VisitVariableDeclarationStatement(varDecl);
                if (varDecl.Modifiers.HasFlag(Modifiers.Const) || varDecl.Role == ForStatement.InitializerRole)
                {
                    return;
                }
                if (varDecl.Variables.Count() > 1)
                {
                    return;
                }
                if (varDecl.Variables.Any(v => !ctx.Resolve(v.Initializer).IsCompileTimeConstant))
                {
                    return;
                }
                var containingBlock = varDecl.GetParent <BlockStatement> ();

                if (containingBlock == null)
                {
                    return;
                }

                var returnTypeRR = ctx.Resolve(varDecl.Type);

                if (!IsValidConstType(returnTypeRR.Type))
                {
                    return;
                }

                var variable = varDecl.Variables.First();
                var vr       = ctx.Resolve(variable) as LocalResolveResult;

                if (vr == null)
                {
                    return;
                }

                if (ctx.Resolve(variable.Initializer).ConstantValue == null)
                {
                    return;
                }

                var assignmentAnalysis = new VariableUsageAnalyzation(ctx);

                containingBlock.AcceptVisitor(assignmentAnalysis);

                if (assignmentAnalysis.GetStatus(vr.Variable) == VariableState.Changed)
                {
                    return;
                }
                AddIssue(new CodeIssue(
                             variable.NameToken,
                             ctx.TranslateString("Convert to constant"),
                             ctx.TranslateString("To const"),
                             script => {
                    var constVarDecl        = (VariableDeclarationStatement)varDecl.Clone();
                    constVarDecl.Modifiers |= Modifiers.Const;
                    if (varDecl.Type.IsVar())
                    {
                        var builder       = ctx.CreateTypeSystemAstBuilder(varDecl);
                        constVarDecl.Type = builder.ConvertType(ctx.Resolve(varDecl.Type).Type);
                    }
                    script.Replace(varDecl, constVarDecl);
                }
                             ));
            }