Пример #1
0
 public Trait(TraitName name)
 {
 }
Пример #2
0
        public override IMatched <Unit> ParseStatement(ParseState state, Token[] tokens)
        {
            var overriding = tokens[1].Text.StartsWith("override");
            var isOperator = tokens[2].Text == "op";
            var isMacro    = tokens[2].Text == "def";

            var className = tokens[4].Text;

            if (className.IsEmpty() && TraitName.IsNotEmpty())
            {
                className = TraitName;
            }

            var functionName = tokens[6].Text;
            var type         = tokens[7].Text;

            if (isOperator && !Module.Global.RegisterOperator(functionName))
            {
                return($"Operator {functionName} already registered".FailedMatch <Unit>());
            }

            var needsParameters = type == "(";

            if (needsParameters)
            {
                state.Colorize(tokens, Color.Keyword, Color.Keyword, Color.Whitespace, Color.Class, Color.Structure, Color.Invokable,
                               Color.OpenParenthesis);
                if (functionName.IsMatch("^ /w+ '=' $"))
                {
                    functionName = $"__${functionName.Drop(-1)}=";
                }
            }
            else
            {
                state.Colorize(tokens, Color.Keyword, Color.Keyword, Color.Whitespace, Color.Class, Color.Structure, Color.Invokable);
                functionName = $"__${functionName}";
            }

            state.CreateYieldFlag();
            state.CreateReturnType();

            if (GetAnyParameters(needsParameters, state).ValueOrCast <Unit>(out var parameters, out var asUnit))
            {
                if (state.CurrentSource.IsMatch("^ /s* '|'"))
                {
                    return(getMatchFunction(state, functionName, parameters, overriding, className));
                }
                else if (state.CurrentSource.StartsWith("("))
                {
                    return(getCurriedFunction(state, functionName, parameters, overriding, className).Map(f =>
                    {
                        if (isMacro)
                        {
                            state.RegisterMacro(f);
                        }
                        else
                        {
                            state.AddStatement(f);
                        }

                        return Unit.Matched();
                    }));
                }
                else
                {
                    return(getAnyBlock(state).Map(block =>
                    {
                        var yielding = state.RemoveYieldFlag();
                        state.RemoveReturnType();
                        var function = new Function(functionName, parameters, block, yielding, overriding, className);
                        if (isMacro)
                        {
                            state.RegisterMacro(function);
                        }
                        else
                        {
                            state.AddStatement(function);
                        }

                        return Unit.Matched();
                    }));
                }
            }
            else
            {
                return(asUnit);
            }
        }