< Summary

Information
Class: AspxLint.Core.Rules.Asp002DuplicateControlId
Assembly: AspxLint.Core
File(s): D:\a\claude-aspx-lint\claude-aspx-lint\src\AspxLint.Core\Rules\Asp002DuplicateControlId.cs
Line coverage
100%
Covered lines: 9
Uncovered lines: 0
Coverable lines: 9
Total lines: 44
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Id()100%11100%
get_Name()100%11100%
get_Severity()100%11100%
get_Description()100%11100%
get_HasFix()100%11100%
.cctor()100%11100%
Fix(...)100%11100%

File(s)

D:\a\claude-aspx-lint\claude-aspx-lint\src\AspxLint.Core\Rules\Asp002DuplicateControlId.cs

#LineLine coverage
 1using System.Text.RegularExpressions;
 2
 3namespace AspxLint.Core.Rules;
 4
 5public sealed class Asp002DuplicateControlId : IRule
 6{
 2057    public string Id => "ASP-002";
 288    public string Name => "ID de controle serveur duplique";
 259    public Severity Severity => Severity.Error;
 10    public string Description =>
 2511        "Deux controles serveur dans la meme page (hors templates repetes) ne peuvent pas avoir le meme ID — cela provoq
 4612    public bool HasFix => false;
 13
 14    // Capture <... ID="xxx" ... runat="server" ...>
 515    private static readonly Regex ControlWithIdRegex = new(
 516        @"<(asp:[a-zA-Z]+|[a-zA-Z]+)\b[^>]*\bID\s*=\s*[""']([^""']+)[""'][^>]*\brunat\s*=\s*[""']?server[""']?",
 517        RegexOptions.IgnoreCase | RegexOptions.Compiled);
 18
 19    public IEnumerable<Issue> Detect(string content, string[] lines, RuleContext ctx)
 20    {
 21        var seen = new Dictionary<string, int>(StringComparer.Ordinal);
 22
 23        for (int i = 0; i < lines.Length; i++)
 24        {
 25            foreach (Match m in ControlWithIdRegex.Matches(lines[i]))
 26            {
 27                var id = m.Groups[2].Value;
 28                if (seen.TryGetValue(id, out var firstLine))
 29                {
 30                    var snippet = m.Value.Length > 80 ? m.Value[..80] + "…" : m.Value;
 31                    yield return new Issue(Id, Name, Severity,
 32                        i + 1, m.Index + 1, snippet,
 33                        $"ID \"{id}\" deja utilise ligne {firstLine}.");
 34                }
 35                else
 36                {
 37                    seen[id] = i + 1;
 38                }
 39            }
 40        }
 41    }
 42
 443    public string? Fix(string content, RuleContext ctx) => null;
 44}