Skip to content

Commit f86f7be

Browse files
authored
Merge pull request #4004 from mansellan/1505
Parser support for PSet special form (VB6)
2 parents 0e1e9de + 0a780f3 commit f86f7be

File tree

5 files changed

+98
-1
lines changed

5 files changed

+98
-1
lines changed

Rubberduck.Parsing/Grammar/VBAParser.g4

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ mainBlockStmt :
148148
| lineSpecialForm
149149
| circleSpecialForm
150150
| scaleSpecialForm
151+
| pSetSpecialForm
151152
| callStmt
152153
| nameStmt
153154
;
@@ -548,10 +549,11 @@ withStmt :
548549
statementLabelDefinition? whiteSpace? END_WITH
549550
;
550551

551-
// Special forms with special syntax, only available in a report.
552+
// Special forms with special syntax, only available in VBA reports or VB6 forms and pictureboxes.
552553
lineSpecialForm : expression whiteSpace (STEP whiteSpace?)? tuple MINUS (STEP whiteSpace?)? tuple whiteSpace? (COMMA whiteSpace? expression)? whiteSpace? (COMMA whiteSpace? lineSpecialFormOption)?;
553554
circleSpecialForm : (expression whiteSpace? DOT whiteSpace?)? CIRCLE whiteSpace (STEP whiteSpace?)? tuple (whiteSpace? COMMA whiteSpace? expression)+;
554555
scaleSpecialForm : (expression whiteSpace? DOT whiteSpace?)? SCALE whiteSpace tuple whiteSpace? MINUS whiteSpace? tuple;
556+
pSetSpecialForm : (expression whiteSpace? DOT whiteSpace?)? PSET (whiteSpace STEP)? whiteSpace? tuple whiteSpace? (COMMA whiteSpace? expression)?;
555557
tuple : LPAREN whiteSpace? expression whiteSpace? COMMA whiteSpace? expression whiteSpace? RPAREN;
556558
lineSpecialFormOption : {_input.Lt(1).Text.ToLower().Equals("b") || _input.Lt(1).Text.ToLower().Equals("bf")}? unrestrictedIdentifier;
557559

Rubberduck.Parsing/Symbols/IdentifierReferenceListener.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,11 @@ public override void EnterScaleSpecialForm(VBAParser.ScaleSpecialFormContext con
331331
_resolver.Resolve(context);
332332
}
333333

334+
public override void EnterPSetSpecialForm(VBAParser.PSetSpecialFormContext context)
335+
{
336+
_resolver.Resolve(context);
337+
}
338+
334339
public override void EnterDebugPrintStmt([NotNull] VBAParser.DebugPrintStmtContext context)
335340
{
336341
_resolver.Resolve(context);

Rubberduck.Parsing/Symbols/IdentifierReferenceResolver.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,15 @@ public void Resolve(VBAParser.ScaleSpecialFormContext context)
761761
}
762762
}
763763

764+
public void Resolve(VBAParser.PSetSpecialFormContext context)
765+
{
766+
foreach (var expr in context.expression())
767+
{
768+
ResolveDefault(expr);
769+
}
770+
ResolveTuple(context.tuple());
771+
}
772+
764773
private void ResolveTuple(VBAParser.TupleContext tuple)
765774
{
766775
foreach (var expr in tuple.expression())

RubberduckTests/Grammar/ResolverTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2402,6 +2402,27 @@ End Sub
24022402
}
24032403
}
24042404

2405+
[Category("Grammar")]
2406+
[Category("Resolver")]
2407+
[Test]
2408+
public void PSetSpecialForm_IsReferenceToLocalVariable()
2409+
{
2410+
var code = @"
2411+
Public Sub Test()
2412+
Dim referenced As Integer
2413+
PSet (referenced, referenced)
2414+
End Sub
2415+
";
2416+
using (var state = Resolve(code))
2417+
{
2418+
2419+
var declaration = state.AllUserDeclarations.Single(item =>
2420+
item.DeclarationType == DeclarationType.Variable && item.IdentifierName == "referenced");
2421+
2422+
Assert.AreEqual(2, declaration.References.Count());
2423+
}
2424+
}
2425+
24052426
[Category("Grammar")]
24062427
[Category("Resolver")]
24072428
[Test]

RubberduckTests/Grammar/VBAParserTests.cs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2211,6 +2211,66 @@ Sub Test()
22112211
AssertTree(parseResult.Item1, parseResult.Item2, "//scaleSpecialForm");
22122212
}
22132213

2214+
[Category("Parser")]
2215+
[Test]
2216+
public void TestPSetVBForm_WithoutStep()
2217+
{
2218+
string code = @"
2219+
Sub Test()
2220+
Me.PSet (1, 2), vbBlack
2221+
End Sub";
2222+
var parseResult = Parse(code);
2223+
AssertTree(parseResult.Item1, parseResult.Item2, "//pSetSpecialForm");
2224+
}
2225+
2226+
[Category("Parser")]
2227+
[Test]
2228+
public void TestPSetVBForm_WithoutOptionalArguments()
2229+
{
2230+
string code = @"
2231+
Sub Test()
2232+
Me.PSet (1, 2)
2233+
End Sub";
2234+
var parseResult = Parse(code);
2235+
AssertTree(parseResult.Item1, parseResult.Item2, "//pSetSpecialForm");
2236+
}
2237+
2238+
[Category("Parser")]
2239+
[Test]
2240+
public void TestPSetSpecialForm()
2241+
{
2242+
string code = @"
2243+
Sub Test()
2244+
PSet Step(1, 2), vbBlack
2245+
End Sub";
2246+
var parseResult = Parse(code);
2247+
AssertTree(parseResult.Item1, parseResult.Item2, "//pSetSpecialForm");
2248+
}
2249+
2250+
[Category("Parser")]
2251+
[Test]
2252+
public void TestPSetSpecialForm_WithoutStep()
2253+
{
2254+
string code = @"
2255+
Sub Test()
2256+
PSet (1, 2), vbBlack
2257+
End Sub";
2258+
var parseResult = Parse(code);
2259+
AssertTree(parseResult.Item1, parseResult.Item2, "//pSetSpecialForm");
2260+
}
2261+
2262+
[Category("Parser")]
2263+
[Test]
2264+
public void TestPSetSpecialForm_WithoutOptionalArguments()
2265+
{
2266+
string code = @"
2267+
Sub Test()
2268+
PSet (1, 2)
2269+
End Sub";
2270+
var parseResult = Parse(code);
2271+
AssertTree(parseResult.Item1, parseResult.Item2, "//pSetSpecialForm");
2272+
}
2273+
22142274
[Category("Parser")]
22152275
[Test]
22162276
public void TestPtrSafeAsSub()

0 commit comments

Comments
 (0)