Skip to content

Commit fbc5c6c

Browse files
author
Andrin Meier
committed
implement new expression binding
1 parent 20852f5 commit fbc5c6c

17 files changed

+4860
-4637
lines changed

Rubberduck.Parsing/Binding/BindingService.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,26 @@ namespace Rubberduck.Parsing.Binding
66
{
77
public sealed class BindingService
88
{
9+
private readonly IBindingContext _defaultBindingContext;
910
private readonly IBindingContext _typedBindingContext;
1011
private readonly IBindingContext _procedurePointerBindingContext;
1112

12-
public BindingService(IBindingContext typedBindingContext, IBindingContext procedurePointerBindingContext)
13+
public BindingService(
14+
IBindingContext defaultBindingContext,
15+
IBindingContext typedBindingContext,
16+
IBindingContext procedurePointerBindingContext)
1317
{
18+
_defaultBindingContext = defaultBindingContext;
1419
_typedBindingContext = typedBindingContext;
1520
_procedurePointerBindingContext = procedurePointerBindingContext;
1621
}
1722

23+
public IBoundExpression ResolveDefault(Declaration module, Declaration parent, string expression)
24+
{
25+
var expr = Parse(expression);
26+
return _defaultBindingContext.Resolve(module, parent, expr);
27+
}
28+
1829
public IBoundExpression ResolveType(Declaration module, Declaration parent, string expression)
1930
{
2031
var expr = Parse(expression);
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
using Antlr4.Runtime;
2+
using Rubberduck.Parsing.Symbols;
3+
4+
namespace Rubberduck.Parsing.Binding
5+
{
6+
public sealed class DefaultBindingContext : IBindingContext
7+
{
8+
private readonly DeclarationFinder _declarationFinder;
9+
10+
public DefaultBindingContext(DeclarationFinder declarationFinder)
11+
{
12+
_declarationFinder = declarationFinder;
13+
}
14+
15+
public IBoundExpression Resolve(Declaration module, Declaration parent, ParserRuleContext expression)
16+
{
17+
dynamic dynamicExpression = expression;
18+
IExpressionBinding bindingTree = Visit(module, parent, dynamicExpression);
19+
if (bindingTree != null)
20+
{
21+
return bindingTree.Resolve();
22+
}
23+
return null;
24+
}
25+
26+
private IExpressionBinding Visit(Declaration module, Declaration parent, VBAExpressionParser.NewExprContext expression)
27+
{
28+
return Visit(module, parent, expression.newExpression());
29+
}
30+
31+
private IExpressionBinding Visit(Declaration module, Declaration parent, VBAExpressionParser.NewExpressionContext expression)
32+
{
33+
var typeExpressionBinding = Visit(module, parent, expression.typeExpression());
34+
if (typeExpressionBinding == null)
35+
{
36+
return null;
37+
}
38+
return new NewTypeBinding(_declarationFinder, module, parent, expression, typeExpressionBinding);
39+
}
40+
41+
private IExpressionBinding Visit(Declaration module, Declaration parent, VBAExpressionParser.TypeExpressionContext expression)
42+
{
43+
if (expression.builtInType() != null)
44+
{
45+
return null;
46+
}
47+
return Visit(module, parent, expression.definedTypeExpression());
48+
}
49+
50+
private IExpressionBinding Visit(Declaration module, Declaration parent, VBAExpressionParser.DefinedTypeExpressionContext expression)
51+
{
52+
if (expression.simpleNameExpression() != null)
53+
{
54+
return Visit(module, parent, expression.simpleNameExpression());
55+
}
56+
return Visit(module, parent, expression.memberAccessExpression());
57+
}
58+
59+
private IExpressionBinding Visit(Declaration module, Declaration parent, VBAExpressionParser.SimpleNameExprContext expression)
60+
{
61+
return Visit(module, parent, expression.simpleNameExpression());
62+
}
63+
64+
private IExpressionBinding Visit(Declaration module, Declaration parent, VBAExpressionParser.SimpleNameExpressionContext expression)
65+
{
66+
return new SimpleNameTypeBinding(_declarationFinder, module, parent, expression);
67+
}
68+
69+
private IExpressionBinding Visit(Declaration module, Declaration parent, VBAExpressionParser.MemberAccessExprContext expression)
70+
{
71+
dynamic lExpression = expression.lExpression();
72+
var lExpressionBinding = Visit(module, parent, lExpression);
73+
return new MemberAccessTypeBinding(_declarationFinder, module, parent, expression, lExpressionBinding);
74+
}
75+
76+
private IExpressionBinding Visit(Declaration module, Declaration parent, VBAExpressionParser.MemberAccessExpressionContext expression)
77+
{
78+
dynamic lExpression = expression.lExpression();
79+
var lExpressionBinding = Visit(module, parent, lExpression);
80+
return new MemberAccessTypeBinding(_declarationFinder, module, parent, expression, lExpressionBinding);
81+
}
82+
}
83+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using Antlr4.Runtime;
2+
using Rubberduck.Parsing.Symbols;
3+
4+
namespace Rubberduck.Parsing.Binding
5+
{
6+
public sealed class NewExpression : BoundExpression
7+
{
8+
private readonly IBoundExpression _typeExpression;
9+
10+
public NewExpression(
11+
Declaration referencedDeclaration,
12+
ParserRuleContext context,
13+
IBoundExpression typeExpression)
14+
: base(referencedDeclaration, ExpressionClassification.Value, context)
15+
{
16+
_typeExpression = typeExpression;
17+
}
18+
19+
public IBoundExpression TypeExpression
20+
{
21+
get
22+
{
23+
return _typeExpression;
24+
}
25+
}
26+
}
27+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using Rubberduck.Parsing.Symbols;
2+
3+
namespace Rubberduck.Parsing.Binding
4+
{
5+
public sealed class NewTypeBinding : IExpressionBinding
6+
{
7+
private readonly DeclarationFinder _declarationFinder;
8+
private readonly Declaration _project;
9+
private readonly Declaration _module;
10+
private readonly Declaration _parent;
11+
private readonly VBAExpressionParser.NewExpressionContext _expression;
12+
private readonly IExpressionBinding _typeExpressionBinding;
13+
14+
public NewTypeBinding(
15+
DeclarationFinder declarationFinder,
16+
Declaration module,
17+
Declaration parent,
18+
VBAExpressionParser.NewExpressionContext expression,
19+
IExpressionBinding typeExpressionBinding)
20+
{
21+
_declarationFinder = declarationFinder;
22+
_project = module.ParentDeclaration;
23+
_module = module;
24+
_parent = parent;
25+
_expression = expression;
26+
_typeExpressionBinding = typeExpressionBinding;
27+
}
28+
29+
public IBoundExpression Resolve()
30+
{
31+
var typeExpression = _typeExpressionBinding.Resolve();
32+
if (typeExpression == null)
33+
{
34+
return null;
35+
}
36+
return new NewExpression(typeExpression.ReferencedDeclaration, _expression, typeExpression);
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)