File: ModuleVerifierLanguage.py

package info (click to toggle)
webkit2gtk 2.51.90-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 484,192 kB
  • sloc: cpp: 3,930,945; javascript: 197,713; ansic: 167,619; python: 53,160; asm: 21,857; ruby: 18,114; perl: 17,149; xml: 4,631; sh: 2,462; yacc: 2,394; java: 2,032; lex: 1,358; pascal: 372; makefile: 215
file content (94 lines) | stat: -rw-r--r-- 2,790 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from enum import Enum


class LanguageStandard(Enum):
    C_99 = "c99"
    GNU_99 = "gnu99"
    C_11 = "c11"
    GNU_11 = "gnu11"
    C_17 = "c17"
    GNU_17 = "gnu17"
    C_23 = "c23"
    GNU_23 = "gnu23"

    @classmethod
    def c_standards(cls: type["LanguageStandard"]) -> set["LanguageStandard"]:
        return {cls.C_99, cls.GNU_99, cls.C_11, cls.GNU_11, cls.C_17, cls.GNU_17, cls.C_23, cls.GNU_23}

    C_PLUS_PLUS_17 = "c++17"
    GNU_PLUS_PLUS_17 = "gnu++17"
    C_PLUS_PLUS_20 = "c++20"
    GNU_PLUS_PLUS_20 = "gnu++20"
    C_PLUS_PLUS_2B = "c++2b"
    GNU_PLUS_PLUS_2B = "gnu++2b"
    C_PLUS_PLUS_23 = "c++23"
    GNU_PLUS_PLUS_23 = "gnu++23"
    C_PLUS_PLUS_2C = "c++2c"
    GNU_PLUS_PLUS_2C = "gnu++2c"
    C_PLUS_PLUS_26 = "c++26"
    GNU_PLUS_PLUS_26 = "gnu++26"

    @classmethod
    def cxx_standards(cls) -> set["LanguageStandard"]:
        return {
            cls.C_PLUS_PLUS_17,
            cls.GNU_PLUS_PLUS_17,
            cls.C_PLUS_PLUS_20,
            cls.GNU_PLUS_PLUS_20,
            cls.C_PLUS_PLUS_2B,
            cls.GNU_PLUS_PLUS_2B,
            cls.C_PLUS_PLUS_23,
            cls.GNU_PLUS_PLUS_23,
            cls.C_PLUS_PLUS_2C,
            cls.GNU_PLUS_PLUS_2C,
            cls.C_PLUS_PLUS_26,
            cls.GNU_PLUS_PLUS_26,
        }


class Language(Enum):
    C = "c"
    C_PLUS_PLUS = "c++"
    OBJECTIVE_C = "objective-c"
    OBJECTIVE_C_PLUS_PLUS = "objective-c++"

    def supported_standards(
        self, standards: list[LanguageStandard]
    ) -> set[LanguageStandard]:
        if self == Language.C or self == Language.OBJECTIVE_C:
            return LanguageStandard.c_standards().intersection(standards)

        if self == Language.C_PLUS_PLUS or self == Language.OBJECTIVE_C_PLUS_PLUS:
            return LanguageStandard.cxx_standards().intersection(standards)

        assert False, "Unreachable code."

    def include_statement(self) -> str:
        if self == Language.C or self == Language.C_PLUS_PLUS:
            return "#include"

        if self == Language.OBJECTIVE_C or self == Language.OBJECTIVE_C_PLUS_PLUS:
            return "#import"

        assert False, "Unreachable code."

    def source_file_extension(self) -> str:
        if self == Language.C:
            return "c"

        if self == Language.C_PLUS_PLUS:
            return "cpp"

        if self == Language.OBJECTIVE_C:
            return "m"

        if self == Language.OBJECTIVE_C_PLUS_PLUS:
            return "mm"

        assert False, "Unreachable code."


def verify_languages(languages: list[Language], standards: list[LanguageStandard]) -> None:
    for language in languages:
        if not language.supported_standards(standards):
            raise AssertionError(f"No standard in '{standards}' is valid for language '{language.value}'")