Skip to content

Commit 9699d57

Browse files
committed
Check that constraint exists. Close #22.
1 parent f750746 commit 9699d57

3 files changed

Lines changed: 68 additions & 9 deletions

File tree

AspNetCoreAnalyzers.Tests/ASP004ParameterSyntaxTests/CodeFix.cs

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ public class CodeFix
1111
private static readonly ExpectedDiagnostic ExpectedDiagnostic = ExpectedDiagnostic.Create(ASP004ParameterSyntax.Descriptor);
1212
private static readonly CodeFixProvider Fix = new ParameterSyntaxFix();
1313

14-
[TestCase("api/orders/↓id:long}", "api/orders/{id:long}")]
15-
[TestCase("api/orders/↓{id:long", "api/orders/{id:long}")]
16-
[TestCase("api/orders/{id:min(1}", "api/orders/{id:min(1)}")]
17-
[TestCase("api/orders/{id:max(1}", "api/orders/{id:max(1)}")]
18-
[TestCase("api/orders/{id:minlength(1}", "api/orders/{id:minlength(1)}")]
19-
[TestCase("api/orders/{id:maxlength(1}", "api/orders/{id:maxlength(1)}")]
20-
[TestCase("api/orders/{id:length(1}", "api/orders/{id:length(1)}")]
21-
[TestCase("api/orders/{id:length(1,2}", "api/orders/{id:length(1,2)}")]
22-
[TestCase("api/orders/{id:range(1,2}", "api/orders/{id:range(1,2)}")]
14+
[TestCase("api/orders/↓id:long}", "api/orders/{id:long}")]
15+
[TestCase("api/orders/↓{id:long", "api/orders/{id:long}")]
16+
[TestCase("api/orders/{id:min(1}", "api/orders/{id:min(1)}")]
17+
[TestCase("api/orders/{id:max(1}", "api/orders/{id:max(1)}")]
18+
[TestCase("api/orders/{id:minlength(1}", "api/orders/{id:minlength(1)}")]
19+
[TestCase("api/orders/{id:maxlength(1}", "api/orders/{id:maxlength(1)}")]
20+
[TestCase("api/orders/{id:length(1}", "api/orders/{id:length(1)}")]
21+
[TestCase("api/orders/{id:length(1,2}", "api/orders/{id:length(1,2)}")]
22+
[TestCase("api/orders/{id:range(1,2}", "api/orders/{id:range(1,2)}")]
2323
[TestCase("api/orders/{id:regex((a|b)-c}", "api/orders/{id:regex((a|b)-c)}")]
2424
public void WhenFixable(string before, string after)
2525
{
@@ -56,5 +56,29 @@ public IActionResult GetId(long id)
5656
}".AssertReplace("api/orders/{id:long}", after);
5757
AnalyzerAssert.CodeFix(Analyzer, Fix, ExpectedDiagnostic, code, fixedCode);
5858
}
59+
60+
[TestCase("api/orders/{id:↓wrong}")]
61+
[TestCase("api/orders/{id:min1)}")]
62+
[TestCase("api/orders/{id:max1)}")]
63+
public void WhenNot(string before)
64+
{
65+
var code = @"
66+
namespace ValidCode
67+
{
68+
using Microsoft.AspNetCore.Mvc;
69+
70+
[ApiController]
71+
public class OrdersController : Controller
72+
{
73+
[HttpGet(""api/orders/↓{id:wrong}"")]
74+
public IActionResult GetId(long id)
75+
{
76+
return this.Ok(id);
77+
}
78+
}
79+
}".AssertReplace("api/orders/↓{id:wrong}", before);
80+
81+
AnalyzerAssert.Diagnostics(Analyzer, ExpectedDiagnostic, code);
82+
}
5983
}
6084
}

AspNetCoreAnalyzers/Analyzers/AttributeAnalyzer.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,29 @@ private static bool HasWrongSyntax(PathSegment segment, out Location location, o
240240
return true;
241241
}
242242
}
243+
244+
if (!text.Equals("int", StringComparison.OrdinalIgnoreCase) &&
245+
!text.Equals("bool", StringComparison.OrdinalIgnoreCase) &&
246+
!text.Equals("datetime", StringComparison.OrdinalIgnoreCase) &&
247+
!text.Equals("decimal", StringComparison.OrdinalIgnoreCase) &&
248+
!text.Equals("double", StringComparison.OrdinalIgnoreCase) &&
249+
!text.Equals("float", StringComparison.OrdinalIgnoreCase) &&
250+
!text.Equals("guid", StringComparison.OrdinalIgnoreCase) &&
251+
!text.Equals("long", StringComparison.OrdinalIgnoreCase) &&
252+
!text.Equals("alpha", StringComparison.OrdinalIgnoreCase) &&
253+
!text.Equals("required", StringComparison.OrdinalIgnoreCase) &&
254+
!text.StartsWith("minlength(", StringComparison.OrdinalIgnoreCase) &&
255+
!text.StartsWith("maxlength(", StringComparison.OrdinalIgnoreCase) &&
256+
!text.StartsWith("length(", StringComparison.OrdinalIgnoreCase) &&
257+
!text.StartsWith("min(", StringComparison.OrdinalIgnoreCase) &&
258+
!text.StartsWith("max(", StringComparison.OrdinalIgnoreCase) &&
259+
!text.StartsWith("regex(", StringComparison.OrdinalIgnoreCase) &&
260+
!text.StartsWith("range(", StringComparison.OrdinalIgnoreCase))
261+
{
262+
location = constraint.Span.GetLocation();
263+
correctSyntax = null;
264+
return true;
265+
}
243266
}
244267
}
245268
else

AspNetCoreAnalyzers/Helpers/Text.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,18 @@ public static void SkipWhiteSpace(string text, ref int pos)
1111
}
1212
}
1313

14+
public static bool TrySkipDigits(string text, ref int pos)
15+
{
16+
var before = pos;
17+
while (pos < text.Length &&
18+
char.IsDigit(text[pos]))
19+
{
20+
pos++;
21+
}
22+
23+
return pos != before;
24+
}
25+
1426
public static bool TrySkipPast(string text, ref int pos, string substring)
1527
{
1628
var before = pos;

0 commit comments

Comments
 (0)