1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-11-06 08:39:09 +02:00

Added param to member expression

This commit is contained in:
Tim Voronov
2019-09-07 01:21:43 -04:00
parent 24370d8178
commit 9c0e81a2f4
9 changed files with 1171 additions and 987 deletions

View File

@@ -63,4 +63,21 @@ func TestParam(t *testing.T) {
So(string(out), ShouldEqual, `[1,2,3,4]`)
})
Convey("Should be possible to use in member expression", t, func() {
prog := compiler.New().
MustCompile(`
RETURN @param.value
`)
out := prog.MustRun(
context.Background(),
runtime.WithParam("param", map[string]interface{}{
"value": "foobar",
}),
)
So(string(out), ShouldEqual, `"foobar"`)
})
}

View File

@@ -736,39 +736,13 @@ func (v *visitor) doVisitForExpressionStatement(ctx *fql.ForExpressionStatementC
}
func (v *visitor) doVisitMemberExpression(ctx *fql.MemberExpressionContext, scope *scope) (core.Expression, error) {
var source core.Expression
var children []antlr.Tree
member, err := v.doVisitMember(ctx.Member().(*fql.MemberContext), scope)
identifier := ctx.Identifier()
if identifier != nil {
varName := ctx.Identifier().GetText()
_, err := scope.GetVariable(varName)
if err != nil {
return nil, err
}
varExp, err := expressions.NewVariableExpression(v.getSourceMap(ctx), varName)
if err != nil {
return nil, err
}
source = varExp
children = ctx.GetChildren()
} else {
fcall, err := v.doVisitFunctionCallExpression(ctx.FunctionCallExpression().(*fql.FunctionCallExpressionContext), scope)
if err != nil {
return nil, err
}
source = fcall
children = ctx.GetChildren()[1:]
if err != nil {
return nil, err
}
children := ctx.MemberPath().GetChildren()
path := make([]core.Expression, 0, len(children))
for _, child := range children {
@@ -808,9 +782,9 @@ func (v *visitor) doVisitMemberExpression(ctx *fql.MemberExpressionContext, scop
path = append(path, exp)
}
member, err := expressions.NewMemberExpression(
exp, err := expressions.NewMemberExpression(
v.getSourceMap(ctx),
source,
member,
path,
)
@@ -818,7 +792,51 @@ func (v *visitor) doVisitMemberExpression(ctx *fql.MemberExpressionContext, scop
return nil, err
}
return member, nil
return exp, nil
}
func (v *visitor) doVisitMember(ctx *fql.MemberContext, scope *scope) (core.Expression, error) {
identifier := ctx.Identifier()
if identifier != nil {
varName := ctx.Identifier().GetText()
_, err := scope.GetVariable(varName)
if err != nil {
return nil, err
}
exp, err := expressions.NewVariableExpression(v.getSourceMap(ctx), varName)
if err != nil {
return nil, err
}
return exp, nil
}
fnCall := ctx.FunctionCallExpression()
if fnCall != nil {
exp, err := v.doVisitFunctionCallExpression(fnCall.(*fql.FunctionCallExpressionContext), scope)
if err != nil {
return nil, err
}
return exp, nil
}
param := ctx.Param()
exp, err := v.doVisitParamContext(param.(*fql.ParamContext), scope)
if err != nil {
return nil, err
}
return exp, nil
}
func (v *visitor) doVisitObjectLiteral(ctx *fql.ObjectLiteralContext, scope *scope) (core.Expression, error) {