Ejemplo n.º 1
0
        private static IDLMemberMethod ToMemberMethod(
            IDLParserToken pp,
            IDLParserToken KeywordGetter,
            IDLParserToken KeywordSetter,
            IDLParserToken KeywordDeleter,
            IDLParserToken KeywordStatic,
            IDLParserToken KeywordAsync,
            IDLParserToken KeywordExtension
            )
        {
            var Type = default(IDLTypeReference);
            var Name = default(IDLParserToken.Literal);

            Func<IDLParserToken> GetParameterSymbols = () => Name.Value.SkipTo();

            var NextToken = pp.SkipTo();

            // are we typeless? IDL is partial...
            if (NextToken.Text != "(")
            {
                Type = ToTypeReference(pp);
                Name = Type.Terminator.SkipTo().AssertName();
            }
            else
            {
                if (KeywordDeleter != null)
                {
                    Type = ToTypeReference(pp);
                    Name = "deleter";
                    GetParameterSymbols = () => pp.SkipTo();
                }
                else
                {
                    // or are we nameless? is this method an indexer?

                    // or any other
                    var NameLookup = new Dictionary<string, string>
                    {
                        {"void", "set"},
                        {"octet", "get"}
                    };

                    if (NameLookup.ContainsKey(pp.Text))
                    {
                        Type = ToTypeReference(pp);
                        Name = NameLookup[pp.Text];
                        GetParameterSymbols = () => pp.SkipTo();
                    }
                    else
                    {
                        if (KeywordGetter == null)
                        {
                            // are we typeless? IDL is partial...
                            Name = pp.AssertName();
                        }
                        else
                        {
                            Type = ToTypeReference(pp);
                            Name = "item";
                            GetParameterSymbols = () => pp.SkipTo();
                        }
                    }
                }
            }

            var Method = new IDLMemberMethod
            {
                ReturnType = Type,

                KeywordGetter = KeywordGetter,
                KeywordSetter = KeywordSetter,
                KeywordStatic = KeywordStatic,
                KeywordAsync = KeywordAsync,
                KeywordExtension = KeywordExtension,

                Name = Name
            };

            var Parameters = Method.Parameters;
            var ParameterSymbols = Method.ParameterSymbols;

            ParameterSymbols.Item1 = GetParameterSymbols();

            ToParameters(Parameters, ParameterSymbols);

            Method.KeywordRaises = Method.ParameterSymbols.Item2.SkipTo();

            if (Method.KeywordRaises.Text == "raises")
            {
                Method.RaisesSymbols.Item1 = Method.KeywordRaises.SkipTo().AssertSymbol("(");
                Method.RaisesType = Method.RaisesSymbols.Item1.SkipTo().ToTypeReference();
                Method.RaisesSymbols.Item2 = Method.RaisesType.Terminator.SkipTo().AssertSymbol(")");

                Method.Terminator = Method.RaisesSymbols.Item2.SkipTo();

            }
            else
            {
                Method.Terminator = Method.KeywordRaises;
                Method.KeywordRaises = null;
            }

            Method.Terminator.AssertSymbol(";");

            return Method;
        }
Ejemplo n.º 2
0
        private static IDLMemberMethod ToMemberMethod(
            IDLParserToken pp,
            IDLParserToken KeywordGetter,
            IDLParserToken KeywordSetter,
            IDLParserToken KeywordDeleter,
            IDLParserToken KeywordStatic,
            IDLParserToken KeywordAsync,
            IDLParserToken KeywordExtension
            )
        {
            var Type = default(IDLTypeReference);
            var Name = default(IDLParserToken.Literal);

            Func <IDLParserToken> GetParameterSymbols = () => Name.Value.SkipTo();

            var NextToken = pp.SkipTo();

            // are we typeless? IDL is partial...
            if (NextToken.Text != "(")
            {
                Type = ToTypeReference(pp);
                Name = Type.Terminator.SkipTo().AssertName();
            }
            else
            {
                if (KeywordDeleter != null)
                {
                    Type = ToTypeReference(pp);
                    Name = "deleter";
                    GetParameterSymbols = () => pp.SkipTo();
                }
                else
                {
                    // or are we nameless? is this method an indexer?

                    // or any other
                    var NameLookup = new Dictionary <string, string>
                    {
                        { "void", "set" },
                        { "octet", "get" }
                    };

                    if (NameLookup.ContainsKey(pp.Text))
                    {
                        Type = ToTypeReference(pp);
                        Name = NameLookup[pp.Text];
                        GetParameterSymbols = () => pp.SkipTo();
                    }
                    else
                    {
                        if (KeywordGetter == null)
                        {
                            // are we typeless? IDL is partial...
                            Name = pp.AssertName();
                        }
                        else
                        {
                            Type = ToTypeReference(pp);
                            Name = "item";
                            GetParameterSymbols = () => pp.SkipTo();
                        }
                    }
                }
            }

            var Method = new IDLMemberMethod
            {
                ReturnType = Type,

                KeywordGetter    = KeywordGetter,
                KeywordSetter    = KeywordSetter,
                KeywordStatic    = KeywordStatic,
                KeywordAsync     = KeywordAsync,
                KeywordExtension = KeywordExtension,

                Name = Name
            };

            var Parameters       = Method.Parameters;
            var ParameterSymbols = Method.ParameterSymbols;

            ParameterSymbols.Item1 = GetParameterSymbols();

            ToParameters(Parameters, ParameterSymbols);

            Method.KeywordRaises = Method.ParameterSymbols.Item2.SkipTo();

            if (Method.KeywordRaises.Text == "raises")
            {
                Method.RaisesSymbols.Item1 = Method.KeywordRaises.SkipTo().AssertSymbol("(");
                Method.RaisesType          = Method.RaisesSymbols.Item1.SkipTo().ToTypeReference();
                Method.RaisesSymbols.Item2 = Method.RaisesType.Terminator.SkipTo().AssertSymbol(")");

                Method.Terminator = Method.RaisesSymbols.Item2.SkipTo();
            }
            else
            {
                Method.Terminator    = Method.KeywordRaises;
                Method.KeywordRaises = null;
            }

            Method.Terminator.AssertSymbol(";");

            return(Method);
        }