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; }
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); }