Skip to content

Commit 56d38fe

Browse files
committed
Handle Is clause with variable
1 parent fcf252d commit 56d38fe

File tree

2 files changed

+50
-15
lines changed

2 files changed

+50
-15
lines changed

Rubberduck.Inspections/Concrete/UnreachableCaseInspection/UCIRangeClauseFilter.cs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -110,39 +110,34 @@ public bool ContainsFilters
110110
}
111111

112112
//IUCIRangeClauseFilter
113-
public void Add(IUCIRangeClauseFilter filterToAdd)
113+
public void Add(IUCIRangeClauseFilter filter)
114114
{
115-
var itf = (UCIRangeClauseFilter<T>)filterToAdd;
116-
if (itf.TryGetIsLTValue(out T isLT))
115+
var newFilter = (UCIRangeClauseFilter<T>)filter;
116+
if (newFilter.TryGetIsLTValue(out T isLT))
117117
{
118118
AddIsClauseImpl(isLT, CompareTokens.LT);
119119
}
120-
if (itf.TryGetIsGTValue(out T isGT))
120+
if (newFilter.TryGetIsGTValue(out T isGT))
121121
{
122122
AddIsClauseImpl(isGT, CompareTokens.GT);
123123
}
124124

125-
//var ranges = itf.RangeValues;
126-
foreach (var tuple in itf.RangeValues)
125+
foreach (var tuple in newFilter.RangeValues)
127126
{
128127
AddValueRangeImpl(tuple.Item1, tuple.Item2);
129128
}
130129

131-
//var varRanges = itf.VariableRanges;
132-
foreach (var val in itf.VariableRanges)
130+
foreach (var val in newFilter.VariableRanges)
133131
{
134132
_variableRanges.Add(val);
135-
//AddValueRangeImpl(tuple.Item1, tuple.Item2);
136133
}
137134

138-
//var relOps = itf.RelationalOps;
139-
foreach (var op in itf.RelationalOps)
135+
foreach (var op in newFilter.RelationalOps)
140136
{
141137
AddRelationalOpImpl(op);
142138
}
143139

144-
//var singleVals = itf.SingleValues;
145-
foreach (var val in itf.SingleValues)
140+
foreach (var val in newFilter.SingleValues)
146141
{
147142
AddSingleValueImpl(val);
148143
}
@@ -151,7 +146,14 @@ public void Add(IUCIRangeClauseFilter filterToAdd)
151146
//IUCIRangeClauseFilter
152147
public void AddIsClause(IUCIValue value, string opSymbol)
153148
{
154-
AddIsClauseImpl(_tConverter(value), opSymbol);
149+
if (value.ParsesToConstantValue)
150+
{
151+
AddIsClauseImpl(_tConverter(value), opSymbol);
152+
}
153+
else
154+
{
155+
AddRelationalOpImpl(value.ValueText);
156+
}
155157
}
156158

157159
//IUCIRangeClauseFilter

RubberduckTests/Inspections/UnreachableCaseInspectionTests.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ public void UciUnit_AddRangeClauses(string firstCase, string filterTypeName, str
449449
[TestCase("Is_<>_100#", "Double", "IsLT=100,IsGT=100")]
450450
[TestCase("Is_<>_True", "Boolean", "RelOp=Is <> True")]
451451
[TestCase(@"Is_<>_""100""", "Long", "IsLT=100,IsGT=100")]
452+
[TestCase("Is_>_x", "Long", "IsLT=x")]
452453
[Category("Inspections")]
453454
public void UciUnit_AddIsClauses(string firstCase, string filterTypeName, string expectedRangeClauses)
454455
{
@@ -465,6 +466,7 @@ public void UciUnit_AddIsClauses(string firstCase, string filterTypeName, string
465466
Assert.AreEqual(expectedResult.First().ToString(), UUT.ToString());
466467
}
467468

469+
[TestCase("IsLT=z,Single=45", "IsLT=z", "Single=45")]
468470
[TestCase("Single=z,Single=45", "Single=z", "Single=45")]
469471
[TestCase("Range=20:x,Single=45", "Range=20:x", "Single=45")]
470472
[TestCase("IsLT=45,Range=20:70", "IsLT=45", "Range=45:70")]
@@ -2055,6 +2057,38 @@ End Select
20552057
CheckActualResultsEqualsExpected(inputCode, unreachable: 2);
20562058
}
20572059

2060+
[TestCase("<")]
2061+
[TestCase(">")]
2062+
[TestCase("<=")]
2063+
[TestCase(">=")]
2064+
[TestCase("<>")]
2065+
[TestCase("=")]
2066+
[Category("Inspections")]
2067+
public void UciFunctional_IsStmtVariables(string opSymbol)
2068+
{
2069+
string inputCode =
2070+
@"
2071+
private const START As Long = 10
2072+
private const FINISH As Long = 3
2073+
2074+
Sub Foo(x As Long, y As Long, z As Long)
2075+
Select Case z
2076+
Case 95
2077+
'OK
2078+
Case Is <opSymbol> x
2079+
'OK
2080+
Case -START To FINISH
2081+
'OK
2082+
Case Is <opSymbol> y
2083+
'Unreachable
2084+
End Select
2085+
2086+
End Sub";
2087+
2088+
inputCode = inputCode.Replace("<opSymbol>", opSymbol);
2089+
CheckActualResultsEqualsExpected(inputCode, unreachable: 1);
2090+
}
2091+
20582092
private static void CheckActualResultsEqualsExpected(string inputCode, int unreachable = 0, int mismatch = 0, int caseElse = 0)
20592093
{
20602094
var expected = new Dictionary<string, int>
@@ -2260,6 +2294,5 @@ private string RestoreModifieStringForRelationalOps(string modified)
22602294
clauseExpression = clauseExpression.Replace(" @ ", " = ");
22612295
return clauseExpression;
22622296
}
2263-
22642297
}
22652298
}

0 commit comments

Comments
 (0)