Exemple #1
0
        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);
        }