Skip to content

Commit f419b47

Browse files
committed
Stop simple name expressions from resolving to Debug.Print
Also fixes resolver in case the outputList is null.
1 parent 9628e94 commit f419b47

File tree

7 files changed

+116
-18
lines changed

7 files changed

+116
-18
lines changed

Rubberduck.Parsing/Binding/Bindings/ObjectPrintDefaultBinding.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public ObjectPrintDefaultBinding(
2121
public IBoundExpression Resolve()
2222
{
2323
var printMethodExpression = _printMethodBinding.Resolve();
24-
var outputListExpression = _outputListBinding.Resolve();
24+
var outputListExpression = _outputListBinding?.Resolve();
2525
return new ObjectPrintExpression(_context, printMethodExpression, outputListExpression);
2626
}
2727
}

Rubberduck.Parsing/Binding/DefaultBindingContext.cs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,14 @@ private IExpressionBinding Visit(Declaration module, Declaration parent, VBAPars
258258
lExpressionBinding,
259259
StatementResolutionContext.Undefined,
260260
expression.printMethod());
261-
var outputListBinding = Visit(
262-
module,
263-
parent,
264-
expression.outputList(),
265-
withBlockVariable);
261+
var outputListContext = expression.outputList();
262+
var outputListBinding = outputListContext != null
263+
? Visit(
264+
module,
265+
parent,
266+
outputListContext,
267+
withBlockVariable)
268+
: null;
266269
return new ObjectPrintDefaultBinding(expression, memberAccessBinding, outputListBinding);
267270
}
268271

@@ -277,11 +280,14 @@ private IExpressionBinding Visit(Declaration module, Declaration parent, VBAPars
277280
printMethodContext,
278281
printMethodContext.GetText(),
279282
StatementResolutionContext.Undefined);
280-
var outputListBinding = Visit(
281-
module,
282-
parent,
283-
expression.outputList(),
284-
withBlockVariable);
283+
var outputListContext = expression.outputList();
284+
var outputListBinding = outputListContext != null
285+
? Visit(
286+
module,
287+
parent,
288+
outputListContext,
289+
withBlockVariable)
290+
: null;
285291
return new ObjectPrintDefaultBinding(expression, simpleNameBinding, outputListBinding);
286292
}
287293

Rubberduck.Parsing/VBA/DeclarationCaching/DeclarationFinder.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,8 +1159,9 @@ public Declaration FindMemberReferencedProjectInModule(Declaration callingProjec
11591159
(Declaration.GetModuleParent(p) == null ||
11601160
Declaration.GetModuleParent(p).DeclarationType == moduleType));
11611161
var accessibleMembers = memberMatches.Where(m => AccessibilityCheck.IsMemberAccessible(callingProject, callingModule, callingParent, m));
1162-
var match = accessibleMembers.FirstOrDefault(member => !(member.IdentifierName.Equals("Assert")
1163-
&& member.QualifiedModuleName.ComponentName.Equals("Debug")));
1162+
var match = accessibleMembers.FirstOrDefault(member => !(member.QualifiedModuleName.ComponentName.Equals("Debug")
1163+
&& (member.IdentifierName.Equals("Assert")
1164+
|| member.IdentifierName.Equals("Print"))));
11641165
return match;
11651166
}
11661167

Rubberduck.Parsing/VBA/ReferenceManagement/BoundExpressionVisitor.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,12 @@ private void Visit(
185185
Declaration scope,
186186
Declaration parent)
187187
{
188-
Visit(expression.OutputListExpression, module, scope, parent);
188+
var outputListExpression = expression.OutputListExpression;
189+
if (outputListExpression != null)
190+
{
191+
Visit(expression.OutputListExpression, module, scope, parent);
192+
}
193+
189194
Visit(expression.PrintMethodExpressions, module, scope, parent);
190195
}
191196

Rubberduck.Parsing/VBA/ReferenceManagement/FailedResolutionVisitor.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,12 @@ private void Visit(MemberAccessExpression expression, Declaration parent, IBound
115115

116116
private void Visit(ObjectPrintExpression expression, Declaration parent, IBoundExpression withExpression)
117117
{
118-
Visit(expression.OutputListExpression, parent, withExpression);
118+
var outputListExpression = expression.OutputListExpression;
119+
if (outputListExpression != null)
120+
{
121+
Visit(expression.OutputListExpression, parent, withExpression);
122+
}
123+
119124
Visit(expression.PrintMethodExpressions, parent, withExpression);
120125
}
121126

Rubberduck.Parsing/VBA/ReferenceManagement/IdentifierReferenceResolver.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,11 @@ public void Resolve(VBAParser.WidthStmtContext context)
502502
public void Resolve(VBAParser.PrintStmtContext context)
503503
{
504504
ResolveDefault(context.markedFileNumber().expression(), true);
505-
ResolveOutputList(context.outputList());
505+
var outputList = context.outputList();
506+
if (outputList != null)
507+
{
508+
ResolveOutputList(outputList);
509+
}
506510
}
507511

508512
public void Resolve(VBAParser.UnqualifiedObjectPrintStmtContext context)
@@ -513,7 +517,11 @@ public void Resolve(VBAParser.UnqualifiedObjectPrintStmtContext context)
513517
public void Resolve(VBAParser.WriteStmtContext context)
514518
{
515519
ResolveDefault(context.markedFileNumber().expression(), true);
516-
ResolveOutputList(context.outputList());
520+
var outputList = context.outputList();
521+
if (outputList != null)
522+
{
523+
ResolveOutputList(outputList);
524+
}
517525
}
518526

519527
private void ResolveOutputList(VBAParser.OutputListContext outputList)

RubberduckTests/Grammar/ResolverTests.cs

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2257,7 +2257,6 @@ public void UnqualifiedObjectPrintExpr_IsReferencePrintOnContainingModule()
22572257
{
22582258
var code = @"
22592259
Sub Test()
2260-
Dim obj As Object
22612260
Dim referenced As String
22622261
Print referenced;referenced, referenced , referenced ;
22632262
End Sub
@@ -6785,5 +6784,79 @@ End Function
67856784
Assert.AreEqual(2, debugAssertReferences.Count());
67866785
}
67876786
}
6787+
6788+
[Category("Grammar")]
6789+
[Category("Resolver")]
6790+
[Test]
6791+
public void PrintWithoutDebug_NoReferenceToDebugPrint()
6792+
{
6793+
var classCode = @"
6794+
Public Function Foo(index As Variant) As Class1
6795+
Print
6796+
End Function
6797+
";
6798+
6799+
var moduleCode = $@"
6800+
Private Function Test() As Variant
6801+
Print
6802+
End Function
6803+
";
6804+
6805+
var vbe = new MockVbeBuilder()
6806+
.ProjectBuilder("TestProject", ProjectProtection.Unprotected)
6807+
.AddComponent("Class1", ComponentType.ClassModule, classCode)
6808+
.AddComponent("Module1", ComponentType.StandardModule, moduleCode)
6809+
.AddReference("VBA", MockVbeBuilder.LibraryPathVBA, 4, 2, true)
6810+
.AddProjectToVbeBuilder()
6811+
.Build();
6812+
6813+
using (var state = Resolve(vbe.Object))
6814+
{
6815+
var debugAssertDeclaration = state.DeclarationFinder
6816+
.BuiltInDeclarations(DeclarationType.Procedure)
6817+
.Single(declaration => declaration.IdentifierName.Equals("Print")
6818+
&& declaration.QualifiedModuleName.ComponentName.Equals("Debug"));
6819+
var debugAssertReferences = debugAssertDeclaration.References;
6820+
6821+
Assert.IsFalse(debugAssertReferences.Any());
6822+
}
6823+
}
6824+
6825+
[Category("Grammar")]
6826+
[Category("Resolver")]
6827+
[Test]
6828+
public void PrintWithDebug_ReferenceToDebugPrint()
6829+
{
6830+
var classCode = @"
6831+
Public Function Foo(index As Variant) As Class1
6832+
Debug.Print 42
6833+
End Function
6834+
";
6835+
6836+
var moduleCode = $@"
6837+
Private Function Test() As Variant
6838+
Debug.Print 42
6839+
End Function
6840+
";
6841+
6842+
var vbe = new MockVbeBuilder()
6843+
.ProjectBuilder("TestProject", ProjectProtection.Unprotected)
6844+
.AddComponent("Class1", ComponentType.ClassModule, classCode)
6845+
.AddComponent("Module1", ComponentType.StandardModule, moduleCode)
6846+
.AddReference("VBA", MockVbeBuilder.LibraryPathVBA, 4, 2, true)
6847+
.AddProjectToVbeBuilder()
6848+
.Build();
6849+
6850+
using (var state = Resolve(vbe.Object))
6851+
{
6852+
var debugAssertDeclaration = state.DeclarationFinder
6853+
.BuiltInDeclarations(DeclarationType.Procedure)
6854+
.Single(declaration => declaration.IdentifierName.Equals("Print")
6855+
&& declaration.QualifiedModuleName.ComponentName.Equals("Debug"));
6856+
var debugAssertReferences = debugAssertDeclaration.References;
6857+
6858+
Assert.AreEqual(2, debugAssertReferences.Count());
6859+
}
6860+
}
67886861
}
67896862
}

0 commit comments

Comments
 (0)