Exemplo n.º 1
0
        PluginResult ResolveNode(ref ExpressionNode Node, Identifier DeclarationType = null,
                                 OverloadSelectionData OverloadData = new OverloadSelectionData(), ResolveNodeFlags Flags = ResolveNodeFlags.None)
        {
            if (Node.InterrupterPlugin != -1)
            {
                if (Node.InterrupterPlugin != Array.IndexOf(Parent.Plugins, this))
                {
                    return(PluginResult.Succeeded);
                }

                var Res = ForceContinue(ref Node, DeclarationType, OverloadData, Flags);
                if (Res != PluginResult.Succeeded)
                {
                    return(Res);
                }

                if (Parent.FinishNode(ref Node, false) == PluginResult.Failed)
                {
                    return(PluginResult.Failed);
                }

                return(PluginResult.Ready);
            }

            return(PluginResult.Succeeded);
        }
Exemplo n.º 2
0
        ExpressionNode ResolveNode(ExpressionNode Node, Identifier DeclarationType = null,
                                   OverloadSelectionData OverloadData = new OverloadSelectionData(), ResolveNodeFlags Flags = ResolveNodeFlags.None)
        {
            var Res = ResolveNode(ref Node, DeclarationType, OverloadData, Flags);

            return(Res == PluginResult.Failed ? null : Node);
        }
Exemplo n.º 3
0
        ExpressionNode GetOrDeclareId(CodeString Name, bool EnableMessages, Identifier T = null,
                                      OverloadSelectionData OverloadData = new OverloadSelectionData())
        {
            if (AutoDeclareMode == AutoDeclareMode.Always)
            {
                return(DeclareVar(Name, T));
            }

            if (T != null && Name.IsValidIdentifierName)
            {
                var Ret = GetId(Name, true, OverloadData);
                if (Ret != null)
                {
                    return(Ret);
                }

                if (AutoDeclareMode == AutoDeclareMode.Enabled)
                {
                    return(DeclareVar(Name, T));
                }

                if (EnableMessages)
                {
                    GetId(Name, false, OverloadData);
                }
                return(null);
            }

            return(GetId(Name, EnableMessages, OverloadData));
        }
Exemplo n.º 4
0
        ExpressionNode GetId(CodeString Code, bool EnableMessages,
                             OverloadSelectionData OverloadData = new OverloadSelectionData(), IdContainer Container = null)
        {
            if (Container == null)
            {
                Container = this.Container;
            }

            var Options = GetIdOptions.Default;

            Options.OverloadData   = OverloadData;
            Options.EnableMessages = EnableMessages;

            var Id = Container.RecognizeIdentifier(Code, Options);

            if (Id == null)
            {
                return(null);
            }

            if (Id is Constructor)
            {
                if (Container.Parent == null)
                {
                    throw new ApplicationException();
                }
                return(GetId(Code, EnableMessages, OverloadData, Container.Parent));
            }

            return(Expressions.CreateReference(Container, Id, Parent, Code, EnableMessages));
        }
Exemplo n.º 5
0
        PluginResult ForceContinue_MemberNode(ref ExpressionNode Node,
                                              OverloadSelectionData OverloadData = new OverloadSelectionData())
        {
            var Ch = Node.Children;

            bool Static;
            var  Ch0Type = GetType(Ch[0], out Static);

            if (Ch0Type == null)
            {
                return(PluginResult.Succeeded);
            }

            var MemberName = Ch[1].Code;
            var Options    = GetIdOptions.Default;

            Options.OverloadData = OverloadData;

            if (Ch0Type is NamespaceType && !Static)
            {
                var IdCh0     = Ch[0] as IdExpressionNode;
                var Namespace = IdCh0.Identifier as Namespace;

                var List = Identifiers.SearchMember(Container, Namespace, MemberName.ToString());
                var Id   = Identifiers.SelectIdentifier(State, List, MemberName, Options);
                if (Id == null)
                {
                    return(PluginResult.Failed);
                }

                Node = Parent.NewNode(new IdExpressionNode(Id, Node.Code));
                if (Node == null || ResolveNode(ref Node) == PluginResult.Failed)
                {
                    return(PluginResult.Failed);
                }

                return(PluginResult.Ready);
            }
            else if (Ch0Type is EnumType && Static)
            {
                var EnumType = Ch0Type as EnumType;
                var Ret      = EnumType.GetValue(State, MemberName);
                if (Ret == null)
                {
                    return(PluginResult.Failed);
                }

                Node = Parent.NewNode(new IdExpressionNode(Ret, Node.Code));
                if (Node == null || ResolveNode(ref Node) == PluginResult.Failed)
                {
                    return(PluginResult.Failed);
                }

                return(PluginResult.Ready);
            }
            else
            {
                var List = Identifiers.SearchMember(Container, Ch0Type, MemberName.ToString());
                var Id   = Identifiers.SelectIdentifier(State, List, MemberName, Options);
                if (Id == null)
                {
                    return(PluginResult.Failed);
                }

                if (!Identifiers.VerifyAccess(Container, Id, MemberName))
                {
                    return(PluginResult.Failed);
                }

                var IdNode = Parent.NewNode(new IdExpressionNode(Id, Node.Code));
                if (IdNode == null)
                {
                    return(PluginResult.Failed);
                }

                if (Static)
                {
                    Node = IdNode;
                    if (ResolveNode(ref Node) == PluginResult.Failed)
                    {
                        return(PluginResult.Failed);
                    }

                    return(PluginResult.Ready);
                }
                else
                {
                    Ch[1] = IdNode;
                }
            }

            return(PluginResult.Succeeded);
        }
Exemplo n.º 6
0
        PluginResult ForceContinue_ScopeResolution(ref ExpressionNode Node,
                                                   OverloadSelectionData OverloadData = new OverloadSelectionData())
        {
            var Ch         = Node.Children;
            var ScopeReses = ScopeResolutions.Get(Node);

            if (ScopeReses.Static)
            {
                if (Ch[0] is StrExpressionNode)
                {
                    var Options = GetIdOptions.DefaultForType;
                    Options.OverloadData = OverloadData;

                    var Id = Container.RecognizeIdentifier(Ch[0].Code, Options);
                    if (Id == null)
                    {
                        return(PluginResult.Failed);
                    }

                    Ch[0] = Parent.NewNode(new IdExpressionNode(Id, Ch[0].Code));
                    if (Ch[0] == null)
                    {
                        return(PluginResult.Failed);
                    }
                }

                Ch[0] = ResolveNode(Ch[0]);
                if (Ch[0] == null)
                {
                    return(PluginResult.Failed);
                }

                if (!(Ch[0].Type.RealId is TypeOfType))
                {
                    State.Messages.Add(MessageId.MustBeType, Ch[0].Code);
                    return(PluginResult.Failed);
                }

                var FScope = Container.FunctionScope;
                if (FScope != null && FScope.SelfVariable != null)
                {
                    var FuncContainer   = FScope.Function.Container;
                    var StructuredScope = FuncContainer.RealContainer as StructuredScope;
                    var Structure       = StructuredScope.StructuredType;
                    var Ch0Id           = Expressions.GetIdentifier(Ch[0]);

                    if (Structure.IsEquivalent(Ch0Id) || Structure.IsSubstructureOf(Ch0Id))
                    {
                        if (!ScopeReses.MakeMemberOf(Parent, FScope.SelfVariable))
                        {
                            return(PluginResult.Failed);
                        }
                    }
                }

                if (ScopeReses.Static)
                {
                    return(ForceContinue_MemberNode(ref Node, OverloadData));
                }
            }

            Node = ScopeReses.GetNode(Parent);
            if (Node == null || ResolveNode(ref Node) == PluginResult.Failed)
            {
                return(PluginResult.Failed);
            }

            return(PluginResult.Ready);
        }
Exemplo n.º 7
0
        PluginResult ForceContinue(ref ExpressionNode Node, Identifier DeclarationType = null,
                                   OverloadSelectionData OverloadData = new OverloadSelectionData(), ResolveNodeFlags Flags = ResolveNodeFlags.None)
        {
            if (Node is StrExpressionNode)
            {
                var StrNode = Node as StrExpressionNode;
                var Code    = StrNode.Code;

                Node = GetOrDeclareId(Code, !DoNotFail, DeclarationType, OverloadData);

                if (Node == null)
                {
                    if (!DoNotFail)
                    {
                        return(PluginResult.Failed);
                    }

                    Node = StrNode;
                    Node.InterrupterPlugin = -1;
                    Dependencies.Add(StrNode.Code);
                }
                else
                {
                    if (ResolveNode(ref Node) == PluginResult.Failed)
                    {
                        return(PluginResult.Failed);
                    }

                    return(PluginResult.Ready);
                }
            }
            else if (Node is IdExpressionNode)
            {
                var IdNode = Node as IdExpressionNode;
                var Id     = IdNode.Identifier.RealId;

                if (!(Id is Constructor))
                {
                    if ((Flags & ResolveNodeFlags.Member) == 0)
                    {
                        var Lang = State.Language;
                        if ((Lang.Flags & LangaugeFlags.AllowMemberFuncStaticRef) == 0 ||
                            !(IdNode.Identifier.RealId is Function))
                        {
                            if (IdNode.Identifier.IsInstanceIdentifier)
                            {
                                State.Messages.Add(MessageId.NonStatic, Node.Code);
                                return(PluginResult.Failed);
                            }
                        }
                    }
                    else
                    {
                        if (!IdNode.Identifier.IsInstanceIdentifier)
                        {
                            State.Messages.Add(MessageId.Static, Node.Code);
                            return(PluginResult.Failed);
                        }
                    }
                }
            }
            else if (Node is LinkingNode)
            {
                var LinkingNode = Node as LinkingNode;
                var LinkedNode  = LinkingNode.LinkedNode;

                LinkedNode.Node = ResolveNode(LinkedNode.Node, DeclarationType, OverloadData);
                if (LinkedNode.Node == null)
                {
                    return(PluginResult.Failed);
                }
            }
            else if (Node is OpExpressionNode)
            {
                var OpNode = Node as OpExpressionNode;
                var Ch     = OpNode.Children;
                var Op     = OpNode.Operator;

                if (Op == Operator.Tuple)
                {
                    var Failed        = false;
                    var TupleDeclType = DeclarationType != null ? DeclarationType.RealId as TupleType : null;
                    for (var i = 0; i < Ch.Length; i++)
                    {
                        var T = (Identifier)null;
                        if (TupleDeclType != null)
                        {
                            T = TupleDeclType.StructuredScope.IdentifierList[i].TypeOfSelf;
                        }

                        if ((Ch[i] = ResolveNode(Ch[i], T)) == null)
                        {
                            Failed = true;
                        }
                    }

                    if (Failed)
                    {
                        return(PluginResult.Failed);
                    }
                }
                else if (Op == Operator.Member)
                {
                    if (Ch[1] is StrExpressionNode)
                    {
                        var Res = ForceContinue_MemberNode(ref Node, OverloadData);
                        if (Res != PluginResult.Succeeded)
                        {
                            return(Res);
                        }
                    }

                    Ch[1] = ResolveNode(Ch[1], Flags: Flags | ResolveNodeFlags.Member);
                    if (Ch[1] == null)
                    {
                        return(PluginResult.Failed);
                    }
                }
                else if (Op == Operator.ScopeResolution)
                {
                    if (Ch[1] is StrExpressionNode)
                    {
                        var Res = ForceContinue_ScopeResolution(ref Node, OverloadData);
                        if (Res != PluginResult.Succeeded)
                        {
                            return(Res);
                        }
                    }

                    Ch[1] = ResolveNode(Ch[1], Flags: Flags | ResolveNodeFlags.Member);
                    if (Ch[1] == null)
                    {
                        return(PluginResult.Failed);
                    }
                }
                else
                {
                    throw new ApplicationException();
                }
            }
            else
            {
                throw new ApplicationException();
            }

            return(PluginResult.Succeeded);
        }