"""
    pygments.lexers.ooc
    ~~~~~~~~~~~~~~~~~~~

    Lexers for the Ooc language.

    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
"""

from pygments.lexer import RegexLexer, bygroups, words
from pygments.token import Text, Comment, Operator, Keyword, Name, String, Number, Punctuation

__all__ = ["OocLexer"]


class OocLexer(RegexLexer):
    """
    For Ooc source code

    .. versionadded:: 1.2
    """

    name = "Ooc"
    url = "http://ooc-lang.org/"
    aliases = ["ooc"]
    filenames = ["*.ooc"]
    mimetypes = ["text/x-ooc"]

    tokens = {
        "root": [
            (
                words(
                    (
                        "class",
                        "interface",
                        "implement",
                        "abstract",
                        "extends",
                        "from",
                        "this",
                        "super",
                        "new",
                        "const",
                        "final",
                        "static",
                        "import",
                        "use",
                        "extern",
                        "inline",
                        "proto",
                        "break",
                        "continue",
                        "fallthrough",
                        "operator",
                        "if",
                        "else",
                        "for",
                        "while",
                        "do",
                        "switch",
                        "case",
                        "as",
                        "in",
                        "version",
                        "return",
                        "true",
                        "false",
                        "null",
                    ),
                    prefix=r"\b",
                    suffix=r"\b",
                ),
                Keyword,
            ),
            (r"include\b", Keyword, "include"),
            (r"(cover)([ \t]+)(from)([ \t]+)(\w+[*@]?)", bygroups(Keyword, Text, Keyword, Text, Name.Class)),
            (r"(func)((?:[ \t]|\\\n)+)(~[a-z_]\w*)", bygroups(Keyword, Text, Name.Function)),
            (r"\bfunc\b", Keyword),
            # Note: %= and ^= not listed on http://ooc-lang.org/syntax
            (r"//.*", Comment),
            (r"(?s)/\*.*?\*/", Comment.Multiline),
            (r"(==?|\+=?|-[=>]?|\*=?|/=?|:=|!=?|%=?|\?|>{1,3}=?|<{1,3}=?|\.\.|" r"&&?|\|\|?|\^=?)", Operator),
            (r"(\.)([ \t]*)([a-z]\w*)", bygroups(Operator, Text, Name.Function)),
            (r"[A-Z][A-Z0-9_]+", Name.Constant),
            (r"[A-Z]\w*([@*]|\[[ \t]*\])?", Name.Class),
            (r"([a-z]\w*(?:~[a-z]\w*)?)((?:[ \t]|\\\n)*)(?=\()", bygroups(Name.Function, Text)),
            (r"[a-z]\w*", Name.Variable),
            # : introduces types
            (r"[:(){}\[\];,]", Punctuation),
            (r"0x[0-9a-fA-F]+", Number.Hex),
            (r"0c[0-9]+", Number.Oct),
            (r"0b[01]+", Number.Bin),
            (r"[0-9_]\.[0-9_]*(?!\.)", Number.Float),
            (r"[0-9_]+", Number.Decimal),
            (r'"(?:\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\"])*"', String.Double),
            (r"'(?:\\.|\\[0-9]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", String.Char),
            (r"@", Punctuation),  # pointer dereference
            (r"\.", Punctuation),  # imports or chain operator
            (r"\\[ \t\n]", Text),
            (r"[ \t]+", Text),
        ],
        "include": [
            (r"[\w/]+", Name),
            (r",", Punctuation),
            (r"[ \t]", Text),
            (r"[;\n]", Text, "#pop"),
        ],
    }
