Skip to content

Commit 1a93fc5

Browse files
Hosch250retailcoder
authored andcommitted
Only set IsAssignment flag on last reference in a chain (#1536)
* Close #1532 * Add tests, kill bug. * Use better ternary condition
1 parent eb24483 commit 1a93fc5

File tree

2 files changed

+151
-1
lines changed

2 files changed

+151
-1
lines changed

Rubberduck.Parsing/Symbols/IdentifierReferenceResolver.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,10 @@ private void ResolveDefault(ParserRuleContext context, string expression,
167167
_boundExpressionVisitor.AddIdentifierReferences(boundExpression,
168168
(exprCtx, identifier, declaration) =>
169169
CreateReference(context, identifier, declaration,
170-
RubberduckParserState.CreateBindingSelection(context, exprCtx), isAssignmentTarget,
170+
RubberduckParserState.CreateBindingSelection(context, exprCtx),
171+
boundExpression is MemberAccessExpression
172+
? isAssignmentTarget && boundExpression.Context.children.Last() == exprCtx
173+
: isAssignmentTarget,
171174
hasExplicitLetStatement));
172175
}
173176
else

RubberduckTests/Grammar/ResolverTests.cs

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1976,5 +1976,152 @@ End Property
19761976

19771977
Assert.AreEqual(1, usages.Count());
19781978
}
1979+
1980+
[TestMethod]
1981+
public void QualifiedSetStatement_FirstSectionDoesNotHaveAssignmentFlag()
1982+
{
1983+
// arrange
1984+
var variableDeclarationClass = @"
1985+
Public foo As Boolean
1986+
";
1987+
1988+
var classVariableDeclarationClass = @"
1989+
Public myClass As Class1
1990+
";
1991+
1992+
var variableCallClass = @"
1993+
Public Sub bar()
1994+
Dim myClassN As Class2
1995+
Set myClassN.myClass.foo = True
1996+
End Sub
1997+
";
1998+
// act
1999+
var state = Resolve(variableDeclarationClass, classVariableDeclarationClass, variableCallClass);
2000+
2001+
// assert
2002+
var declaration = state.AllUserDeclarations.Single(item =>
2003+
item.DeclarationType == DeclarationType.Variable && item.IdentifierName == "myClassN");
2004+
2005+
Assert.IsFalse(declaration.References.ElementAt(0).IsAssignment);
2006+
}
2007+
2008+
[TestMethod]
2009+
public void QualifiedSetStatement_MiddleSectionDoesNotHaveAssignmentFlag()
2010+
{
2011+
// arrange
2012+
var variableDeclarationClass = @"
2013+
Public foo As Boolean
2014+
";
2015+
2016+
var classVariableDeclarationClass = @"
2017+
Public myClass As Class1
2018+
";
2019+
2020+
var variableCallClass = @"
2021+
Public Sub bar()
2022+
Dim myClassN As Class2
2023+
Set myClassN.myClass.foo = True
2024+
End Sub
2025+
";
2026+
// act
2027+
var state = Resolve(variableDeclarationClass, classVariableDeclarationClass, variableCallClass);
2028+
2029+
// assert
2030+
var declaration = state.AllUserDeclarations.Single(item =>
2031+
item.DeclarationType == DeclarationType.Variable && item.IdentifierName == "myClass");
2032+
2033+
Assert.IsFalse(declaration.References.ElementAt(0).IsAssignment);
2034+
}
2035+
2036+
[TestMethod]
2037+
public void QualifiedSetStatement_LastSectionHasAssignmentFlag()
2038+
{
2039+
// arrange
2040+
var variableDeclarationClass = @"
2041+
Public foo As Boolean
2042+
";
2043+
2044+
var classVariableDeclarationClass = @"
2045+
Public myClass As Class1
2046+
";
2047+
2048+
var variableCallClass = @"
2049+
Public Sub bar()
2050+
Dim myClassN As Class2
2051+
Set myClassN.myClass.foo = True
2052+
End Sub
2053+
";
2054+
// act
2055+
var state = Resolve(variableDeclarationClass, classVariableDeclarationClass, variableCallClass);
2056+
2057+
// assert
2058+
var declaration = state.AllUserDeclarations.Single(item =>
2059+
item.DeclarationType == DeclarationType.Variable && item.IdentifierName == "foo");
2060+
2061+
Assert.IsTrue(declaration.References.ElementAt(0).IsAssignment);
2062+
}
2063+
2064+
[TestMethod]
2065+
public void SetStatement_HasAssignmentFlag()
2066+
{
2067+
// arrange
2068+
var variableDeclarationClass = @"
2069+
Public foo As Variant
2070+
2071+
Public Sub bar()
2072+
Set foo = New Class2
2073+
End Sub
2074+
";
2075+
// act
2076+
var state = Resolve(variableDeclarationClass, string.Empty);
2077+
2078+
// assert
2079+
var declaration = state.AllUserDeclarations.Single(item =>
2080+
item.DeclarationType == DeclarationType.Variable && item.IdentifierName == "foo");
2081+
2082+
Assert.IsTrue(declaration.References.ElementAt(0).IsAssignment);
2083+
}
2084+
2085+
[TestMethod]
2086+
public void ImplicitLetStatement_HasAssignmentFlag()
2087+
{
2088+
// arrange
2089+
var variableDeclarationClass = @"
2090+
Public foo As Boolean
2091+
2092+
Public Sub bar()
2093+
foo = True
2094+
End Sub
2095+
";
2096+
// act
2097+
var state = Resolve(variableDeclarationClass);
2098+
2099+
// assert
2100+
var declaration = state.AllUserDeclarations.Single(item =>
2101+
item.DeclarationType == DeclarationType.Variable && item.IdentifierName == "foo");
2102+
2103+
Assert.IsTrue(declaration.References.ElementAt(0).IsAssignment);
2104+
}
2105+
2106+
[TestMethod]
2107+
public void ExplicitLetStatement_HasAssignmentFlag()
2108+
{
2109+
// arrange
2110+
var variableDeclarationClass = @"
2111+
Public foo As Boolean
2112+
2113+
Public Sub bar()
2114+
Let foo = True
2115+
End Sub
2116+
";
2117+
// act
2118+
var state = Resolve(variableDeclarationClass);
2119+
2120+
// assert
2121+
var declaration = state.AllUserDeclarations.Single(item =>
2122+
item.DeclarationType == DeclarationType.Variable && item.IdentifierName == "foo");
2123+
2124+
Assert.IsTrue(declaration.References.ElementAt(0).IsAssignment);
2125+
}
19792126
}
19802127
}

0 commit comments

Comments
 (0)