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); } )); }