private static InterfaceInfo ParseInterface(ref ParsingContext context) { var desc = new InterfaceInfo { Access = context.CurrentAccessLevel, }; // Read the documentation comment desc.Comment = ParseComment(ref context); // Read parameters from the tag var tagParams = ParseTagParameters(ref context); // Read 'class' keyword var token = context.Tokenizer.NextToken(); if (token.Value != "class") { throw new Exception($"Invalid API_INTERFACE usage (expected 'class' keyword but got '{token.Value} {context.Tokenizer.NextToken().Value}')."); } // Read specifiers while (true) { token = context.Tokenizer.NextToken(); if (!desc.IsDeprecated && token.Value == "DEPRECATED") { desc.IsDeprecated = true; } else { context.Tokenizer.PreviousToken(); break; } } // Read name desc.Name = desc.NativeName = ParseName(ref context); // Read inheritance ParseInheritance(ref context, desc, out _); // Process tag parameters foreach (var tag in tagParams) { switch (tag.Tag.ToLower()) { case "public": desc.Access = AccessLevel.Public; break; case "protected": desc.Access = AccessLevel.Protected; break; case "private": desc.Access = AccessLevel.Private; break; case "inbuild": desc.IsInBuild = true; break; case "attributes": desc.Attributes = tag.Value; break; case "name": desc.Name = tag.Value; break; case "namespace": desc.Namespace = tag.Value; break; default: Log.Warning($"Unknown or not supported tag parameter {tag} used on interface {desc.Name} at line {context.Tokenizer.CurrentLine}"); break; } } return(desc); }
private static InterfaceInfo ParseInterface(ref ParsingContext context) { var desc = new InterfaceInfo { Access = context.CurrentAccessLevel, }; // Read the documentation comment desc.Comment = ParseComment(ref context); // Read parameters from the tag var tagParams = ParseTagParameters(ref context); // Read 'class' keyword var token = context.Tokenizer.NextToken(); if (token.Value != "class") { throw new Exception($"Invalid API_INTERFACE usage (expected 'class' keyword but got '{token.Value} {context.Tokenizer.NextToken().Value}')."); } // Read name desc.Name = desc.NativeName = ParseName(ref context); if (desc.Name.Length < 2 || desc.Name[0] != 'I' || !char.IsUpper(desc.Name[1])) { throw new Exception($"Invalid API_INTERFACE name '{desc.Name}' (it must start with 'I' character followed by the uppercase character)."); } // Read inheritance ParseInheritance(ref context, desc, out _); // Process tag parameters foreach (var tag in tagParams) { switch (tag.Tag.ToLower()) { case "public": desc.Access = AccessLevel.Public; break; case "protected": desc.Access = AccessLevel.Protected; break; case "private": desc.Access = AccessLevel.Private; break; case "inbuild": desc.IsInBuild = true; break; case "attributes": desc.Attributes = tag.Value; break; case "name": desc.Name = tag.Value; break; case "namespace": desc.Namespace = tag.Value; break; default: Log.Warning($"Unknown or not supported tag parameter {tag} used on interface {desc.Name} at line {context.Tokenizer.CurrentLine}"); break; } } return(desc); }