diff --git a/Rubberduck.Parsing/Binding/Bindings/SimpleNameDefaultBinding.cs b/Rubberduck.Parsing/Binding/Bindings/SimpleNameDefaultBinding.cs index dc9ed11286..7c70e6b00d 100644 --- a/Rubberduck.Parsing/Binding/Bindings/SimpleNameDefaultBinding.cs +++ b/Rubberduck.Parsing/Binding/Bindings/SimpleNameDefaultBinding.cs @@ -1,7 +1,6 @@ using Antlr4.Runtime; using Rubberduck.Parsing.Symbols; using System.Linq; -using Rubberduck.Parsing.Grammar; namespace Rubberduck.Parsing.Binding { @@ -75,14 +74,9 @@ public IBoundExpression Resolve() var bracketedExpression = _declarationFinder.OnBracketedExpression(_context.GetText(), _context); return new SimpleNameExpression(bracketedExpression, ExpressionClassification.Unbound, _context); } - //TODO - this is a complete and total hack to prevent `Mid` and `Mid$` from creating undeclared variables - //pending an actual fix to the grammar. See #2618 - else if (!_name.Equals("Mid") && !_name.Equals("Mid$")) - { - var undeclaredLocal = _declarationFinder.OnUndeclaredVariable(_parent, _name, _context); - return new SimpleNameExpression(undeclaredLocal, ExpressionClassification.Variable, _context); - } - return new ResolutionFailedExpression(); + + var undeclaredLocal = _declarationFinder.OnUndeclaredVariable(_parent, _name, _context); + return new SimpleNameExpression(undeclaredLocal, ExpressionClassification.Variable, _context); } private IBoundExpression ResolveProcedureNamespace() diff --git a/RubberduckTests/Grammar/VBAParserTests.cs b/RubberduckTests/Grammar/VBAParserTests.cs index 194f9619c3..b8017508a6 100644 --- a/RubberduckTests/Grammar/VBAParserTests.cs +++ b/RubberduckTests/Grammar/VBAParserTests.cs @@ -2873,7 +2873,118 @@ End Sub var parseResult = Parse(code); AssertTree(parseResult.Item1, parseResult.Item2, "//midStatement", matches => matches.Count == 1); } - + + [Category("Parser")] + [Test] + public void MidDollarStatement() + { + const string code = @" +Public Sub Test() + Dim TestString As String + TestString = ""The dog jumps"" + Mid$(TestString, 5, 3) = ""fox"" +End Sub +"; + var parseResult = Parse(code); + AssertTree(parseResult.Item1, parseResult.Item2, "//midStatement", matches => matches.Count == 1); + } + + public void MidBStatement() + { + const string code = @" +Public Sub Test() + Dim TestString As String + TestString = ""The dog jumps"" + MidB(TestString, 5, 3) = ""fox"" +End Sub +"; + var parseResult = Parse(code); + AssertTree(parseResult.Item1, parseResult.Item2, "//midStatement", matches => matches.Count == 1); + } + + [Category("Parser")] + [Test] + public void MidBDollarStatement() + { + const string code = @" +Public Sub Test() + Dim TestString As String + TestString = ""The dog jumps"" + MidB$(TestString, 5, 3) = ""fox"" +End Sub +"; + var parseResult = Parse(code); + AssertTree(parseResult.Item1, parseResult.Item2, "//midStatement", matches => matches.Count == 1); + } + + [Category("Parser")] + [Test] + public void MidFunction() + { + const string code = @" +Public Sub Test() + Dim TestString As String + TestString = ""The dog jumps"" + If Mid(TestString, 5, 3) = ""fox"" Then + MsgBox ""Found"" + End If +End Sub +"; + var parseResult = Parse(code); + AssertTree(parseResult.Item1, parseResult.Item2, "//midStatement", matches => matches.Count == 0); + } + + [Category("Parser")] + [Test] + public void MidDollarFunction() + { + const string code = @" +Public Sub Test() + Dim TestString As String + TestString = ""The dog jumps"" + If Mid$(TestString, 5, 3) = ""fox"" Then + MsgBox ""Found"" + End If +End Sub +"; + var parseResult = Parse(code); + AssertTree(parseResult.Item1, parseResult.Item2, "//midStatement", matches => matches.Count == 0); + } + + [Category("Parser")] + [Test] + public void MidBFunction() + { + const string code = @" +Public Sub Test() + Dim TestString As String + TestString = ""The dog jumps"" + If MidB(TestString, 5, 3) = ""fox"" Then + MsgBox ""Found"" + End If +End Sub +"; + var parseResult = Parse(code); + AssertTree(parseResult.Item1, parseResult.Item2, "//midStatement", matches => matches.Count == 0); + } + + [Category("Parser")] + [Test] + public void MidBDollarFunction() + { + const string code = @" +Public Sub Test() + Dim TestString As String + TestString = ""The dog jumps"" + If MidB$(TestString, 5, 3) = ""fox"" Then + MsgBox ""Found"" + End If +End Sub +"; + var parseResult = Parse(code); + AssertTree(parseResult.Item1, parseResult.Item2, "//midStatement", matches => matches.Count == 0); + } + private Tuple Parse(string code, PredictionMode predictionMode = null) { var stream = new AntlrInputStream(code);