Ejemplo n.º 1
0
        protected override List<AphidExpression> MutateCore(AphidExpression expression, out bool hasChanged)
        {
            hasChanged = false;

            CallExpression call;
            IdentifierExpression id;

            // Todo: handle member access e.g. decimal.Parse
            if (expression.Type == AphidNodeType.CallExpression &&
                (call = expression.ToCall()).FunctionExpression.Type == AphidNodeType.IdentifierExpression &&
                _parseFunctions.Contains(call.FunctionExpression.ToIdentifier().Identifier))
            {
                _skip = true;
            }
            //else if (expression.Type == AphidNodeType.BinaryOperatorExpression &&
            //    (binOp = expression.ToBinaryOperator()).LeftOperand.Type == AphidNodeType.IdentifierExpression &&
            //    _parseFunctions.Contains(binOp.LeftOperand.ToIdentifier().Identifier))
            //{
            //    _skip = true;
            //}
            else if (expression.Type == AphidNodeType.IdentifierExpression &&
                _parseFunctions.Contains((id = expression.ToIdentifier()).Identifier))
            {
                if (_skip)
                {
                    _skip = false;
                }
                else
                {
                    hasChanged = true;

                    return new List<AphidExpression> { new CallExpression(id) };
                }
            }

            return null;
        }
Ejemplo n.º 2
0
        protected override List<AphidExpression> MutateCore(AphidExpression expression, out bool hasChanged)
        {
            hasChanged = false;

            if (IsStatement && expression.Type == AphidNodeType.IdentifierExpression)
            {
                var idExp = expression.ToIdentifier();
                var currentId = ParserIdentifier.FromIdentifierExpression(idExp);
                ParserIdentifier inferredId;

                if (!_idTable.TryResolve(idExp.Identifier, out inferredId))
                {
                    _idTable.Add(idExp.Identifier, currentId);
                    hasChanged = true;
                }
                else
                {
                    if (!currentId.IsList && inferredId.IsList)
                    {
                        currentId.IsList = inferredId.IsList;
                        currentId.Type = inferredId.Type;
                        hasChanged = true;

                        return new List<AphidExpression>
                        {
                            new BinaryOperatorExpression(
                                currentId.ToIdentifierExpression(),
                                AphidTokenType.AssignmentOperator,
                                new IdentifierExpression(
                                    currentId.Type ?? _config.BaseClass,
                                    new List<IdentifierExpression> { new IdentifierExpression("list") }))
                        };
                    }
                }
            }

            CallExpression funcExp;
            BinaryOperatorExpression binOpExp;

            if (expression.Type == AphidNodeType.CallExpression &&
                (funcExp = expression.ToCall()).FunctionExpression.Type == AphidNodeType.BinaryOperatorExpression &&
                ((binOpExp = funcExp.FunctionExpression.ToBinaryOperator()).Operator == AphidTokenType.MemberOperator) &&
                binOpExp.LeftOperand.Type == AphidNodeType.IdentifierExpression &&
                binOpExp.RightOperand.Type == AphidNodeType.IdentifierExpression &&
                binOpExp.RightOperand.ToIdentifier().Identifier == "Add")
            {
                var id = binOpExp.LeftOperand.ToIdentifier().Identifier;
                ParserIdentifier ids;

                if (!_idTable.TryResolve(id, out ids))
                {
                    _idTable.Add(id, ids = new ParserIdentifier() { Name = id });
                }

                if (!ids.IsList)
                {
                    ids.IsList = true;

                    if (ids.Type == null)
                    {
                        ids.Type = _config.BaseClass;
                    }

                    hasChanged = true;
                }
            }

            UnaryOperatorExpression unOpExp;

            if (expression.Type == AphidNodeType.UnaryOperatorExpression &&
                (unOpExp = expression.ToUnaryOperator()).Operator == AphidTokenType.retKeyword)
            {
                if (unOpExp.Operand.Type == AphidNodeType.IdentifierExpression)
                {
                    var retId = unOpExp.Operand.ToIdentifier();

                    if (!_returnIds.Contains(retId.Identifier))
                    {
                        hasChanged = true;
                        _returnIds.Add(retId.Identifier);
                    }
                }
            }
            //else if (expression.Type == AphidNodeType.BinaryOperatorExpression &&
            //    (binOpExp = expression.ToBinaryOperator()).

            return new List<AphidExpression> { expression };
            //throw new NotImplementedException();
        }