public static IDLTypeReference ToTypeReference(this IDLParserToken source) { var Namespace = source; var Operator = Namespace.Next.CombineToSymbol("::"); var Name = default(IDLParserToken); if (Operator.Text == "::") { Name = Operator.Next; } else { if (Namespace.Text == "unsigned") Name = Operator.Next; else { Name = Namespace; Namespace = null; } } #region long long if (Name.Text == "long") { var k = Name.SkipTo(); if (k.Text == "long") { Name = new[] { Name, Name.Next, k }.Combine(); } } #endregion while (Name.Next.Text == ".") { var NameFragment = Name.Next.SkipTo().AssertName(); Name = new[] { Name, Name.Next, NameFragment }.Combine(); } var r = new IDLTypeReference { Name = Name.AssertName(), Operator = Operator, Namespace = Namespace }; #region generic if (Name.Next.Text == "<") { r.GenericParameterSymbols.Item1 = Name.Next; r.GenericParameterSymbols.Item2 = r.GenericParameterSymbols.Item1.UntilSelected( pp => { if (pp.Text != ">") { if (r.GenericParameters.Count > 0) { pp.AssertSymbol(","); } var rr = ToTypeReference(pp.SkipTo()); r.GenericParameters.Add(rr); return rr.Terminator.SkipTo(); } return pp; } ).AssertSymbol(">"); } #endregion if (Name.Next.Text == "[") { r.ArraySymbols.Item1 = Name.Next; r.ArraySymbols.Item2 = r.ArraySymbols.Item1.SkipTo().AssertSymbol("]"); } if (r.Terminator.Next.Text == "?") { r.NullableSymbol = r.Terminator.Next; } return r; }
public static IDLTypeReference ToTypeReference(this IDLParserToken source) { var Namespace = source; var Operator = Namespace.Next.CombineToSymbol("::"); var Name = default(IDLParserToken); if (Operator.Text == "::") { Name = Operator.Next; } else { if (Namespace.Text == "unsigned") { Name = Operator.Next; } else { Name = Namespace; Namespace = null; } } #region long long if (Name.Text == "long") { var k = Name.SkipTo(); if (k.Text == "long") { Name = new[] { Name, Name.Next, k }.Combine(); } } #endregion while (Name.Next.Text == ".") { var NameFragment = Name.Next.SkipTo().AssertName(); Name = new[] { Name, Name.Next, NameFragment }.Combine(); } var r = new IDLTypeReference { Name = Name.AssertName(), Operator = Operator, Namespace = Namespace }; #region generic if (Name.Next.Text == "<") { r.GenericParameterSymbols.Item1 = Name.Next; r.GenericParameterSymbols.Item2 = r.GenericParameterSymbols.Item1.UntilSelected( pp => { if (pp.Text != ">") { if (r.GenericParameters.Count > 0) { pp.AssertSymbol(","); } var rr = ToTypeReference(pp.SkipTo()); r.GenericParameters.Add(rr); return(rr.Terminator.SkipTo()); } return(pp); } ).AssertSymbol(">"); } #endregion if (Name.Next.Text == "[") { r.ArraySymbols.Item1 = Name.Next; r.ArraySymbols.Item2 = r.ArraySymbols.Item1.SkipTo().AssertSymbol("]"); } if (r.Terminator.Next.Text == "?") { r.NullableSymbol = r.Terminator.Next; } return(r); }