зеркало из https://github.com/github/codeql.git
Swift: dbscheme generator
This patch introduces the basic infrastructure of the code generation suite and the `dbscheme` generator. Notice that the checked in `schema.yml` should reflect swift 5.6 but might need some tweaking. Closes https://github.com/github/codeql-c-team/issues/979
This commit is contained in:
Родитель
d094bbc06d
Коммит
91fd83a554
|
@ -4,6 +4,32 @@ The Swift codeql package is an experimental and unsupported work in progress.
|
|||
|
||||
## Usage
|
||||
|
||||
Run `bazel run //swift:create-extractor-pack`, which will install `swift/extractor-pack`.
|
||||
Run
|
||||
|
||||
```bash
|
||||
bazel run //swift:create-extractor-pack
|
||||
```
|
||||
|
||||
which will install `swift/extractor-pack`.
|
||||
|
||||
Using `--search-path=swift/extractor-pack` will then pick up the Swift extractor. You can also use
|
||||
`--search-path=swift`, as the extractor pack is mentioned in `swift/.codeqlmanifest.json`.
|
||||
|
||||
Notice you can run `bazel run :create-extractor-pack` if you already are in the `swift` directory.
|
||||
|
||||
## Code generation
|
||||
|
||||
Make sure to install the [pip requirements](./codegen/requirements.txt) via
|
||||
|
||||
```bash
|
||||
python3 -m pip install -r codegen/requirements.txt
|
||||
```
|
||||
|
||||
Run
|
||||
|
||||
```bash
|
||||
bazel run //swift/codegen
|
||||
```
|
||||
|
||||
to update generated files. This can be shortened to
|
||||
`bazel run codegen` if you are in the `swift` directory.
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
py_binary(
|
||||
name = "codegen",
|
||||
srcs = glob(["**/*.py"]),
|
||||
data = glob(["**/*.mustache"]) + [
|
||||
"schema.yml",
|
||||
"prefix.dbscheme",
|
||||
],
|
||||
)
|
|
@ -0,0 +1,7 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
from lib import generator
|
||||
import dbschemegen
|
||||
|
||||
if __name__ == "__main__":
|
||||
generator.run(dbschemegen.generate)
|
|
@ -0,0 +1,76 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import inflection
|
||||
|
||||
from lib.renderer import Renderer
|
||||
from lib.dbscheme import *
|
||||
from lib import paths, schema, generator
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def dbtype(typename):
|
||||
if typename[0].isupper():
|
||||
return "@" + inflection.underscore(typename)
|
||||
return typename
|
||||
|
||||
|
||||
def cls_to_dbscheme(cls: schema.Class):
|
||||
if cls.derived:
|
||||
yield DbUnion(dbtype(cls.name), (dbtype(c) for c in cls.derived))
|
||||
if not cls.derived or any(f.is_single() for f in cls.fields):
|
||||
binding = not cls.derived
|
||||
keyset = DbKeySet(["id"]) if cls.derived else None
|
||||
yield DbTable(
|
||||
keyset=keyset,
|
||||
name=inflection.tableize(cls.name),
|
||||
columns=[
|
||||
DbColumn("id", type=dbtype(cls.name), binding=binding),
|
||||
] + [
|
||||
DbColumn(f.name, dbtype(f.type)) for f in cls.fields if f.is_single()
|
||||
]
|
||||
)
|
||||
for f in cls.fields:
|
||||
if f.is_optional():
|
||||
yield DbTable(
|
||||
keyset=DbKeySet(["id"]),
|
||||
name=inflection.tableize(f"{cls.name}_{f.name}"),
|
||||
columns=[
|
||||
DbColumn("id", type=dbtype(cls.name)),
|
||||
DbColumn(f.name, dbtype(f.type)),
|
||||
],
|
||||
)
|
||||
elif f.is_repeated():
|
||||
yield DbTable(
|
||||
keyset=DbKeySet(["id", "index"]),
|
||||
name=inflection.tableize(f"{cls.name}_{f.name}"),
|
||||
columns=[
|
||||
DbColumn("id", type=dbtype(cls.name)),
|
||||
DbColumn("index", type="int"),
|
||||
DbColumn(inflection.singularize(f.name), dbtype(f.type)),
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def generate(opts):
|
||||
input = opts.schema.resolve()
|
||||
out = opts.dbscheme.resolve()
|
||||
renderer = Renderer(opts.check)
|
||||
|
||||
with open(input) as src:
|
||||
data = schema.load(src)
|
||||
|
||||
declarations = [d for cls in data.classes.values() for d in cls_to_dbscheme(cls)]
|
||||
|
||||
includes = []
|
||||
for inc in data.includes:
|
||||
inc = input.parent / inc
|
||||
with open(inc) as inclusion:
|
||||
includes.append({"src": inc.relative_to(paths.swift_dir), "data": inclusion.read()})
|
||||
renderer.render("dbscheme", out, includes=includes, src=input.relative_to(paths.swift_dir),
|
||||
declarations=declarations)
|
||||
return renderer.written
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
generator.run(generate, tags=["schema", "dbscheme"])
|
|
@ -0,0 +1,85 @@
|
|||
import logging
|
||||
import re
|
||||
from dataclasses import dataclass
|
||||
from typing import ClassVar, List
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
dbscheme_keywords = {"case", "boolean", "int", "string", "type"}
|
||||
|
||||
|
||||
@dataclass
|
||||
class DbColumn:
|
||||
schema_name: str
|
||||
type: str
|
||||
binding: bool = False
|
||||
first: bool = False
|
||||
|
||||
def name(self):
|
||||
if self.schema_name in dbscheme_keywords:
|
||||
return self.schema_name + "_"
|
||||
return self.schema_name
|
||||
|
||||
def lhstype(self):
|
||||
if self.type[0] == "@":
|
||||
return "unique int" if self.binding else "int"
|
||||
return self.type
|
||||
|
||||
def rhstype(self):
|
||||
if self.type[0] == "@" and self.binding:
|
||||
return self.type
|
||||
return self.type + " ref"
|
||||
|
||||
|
||||
@dataclass
|
||||
class DbKeySetId:
|
||||
id: str
|
||||
first: bool = False
|
||||
|
||||
|
||||
@dataclass
|
||||
class DbKeySet:
|
||||
ids: List[DbKeySetId]
|
||||
|
||||
def __post_init__(self):
|
||||
assert self.ids
|
||||
self.ids = [DbKeySetId(x) for x in self.ids]
|
||||
self.ids[0].first = True
|
||||
|
||||
|
||||
class DbDecl:
|
||||
is_table = False
|
||||
is_union = False
|
||||
|
||||
|
||||
@dataclass
|
||||
class DbTable(DbDecl):
|
||||
is_table: ClassVar = True
|
||||
|
||||
name: str
|
||||
columns: List[DbColumn]
|
||||
keyset: DbKeySet = None
|
||||
|
||||
def __post_init__(self):
|
||||
if self.columns:
|
||||
self.columns[0].first = True
|
||||
|
||||
|
||||
@dataclass
|
||||
class DbUnionCase:
|
||||
type: str
|
||||
first: bool = False
|
||||
|
||||
|
||||
@dataclass
|
||||
class DbUnion(DbDecl):
|
||||
is_union: ClassVar = True
|
||||
|
||||
lhs: str
|
||||
rhs: List[DbUnionCase]
|
||||
|
||||
def __post_init__(self):
|
||||
assert self.rhs
|
||||
self.rhs = [DbUnionCase(x) for x in self.rhs]
|
||||
self.rhs.sort(key=lambda c: c.type)
|
||||
self.rhs[0].first = True
|
|
@ -0,0 +1,55 @@
|
|||
import argparse
|
||||
import collections
|
||||
import logging
|
||||
import pathlib
|
||||
import sys
|
||||
|
||||
from . import paths
|
||||
|
||||
options = collections.defaultdict(list)
|
||||
|
||||
|
||||
class Option:
|
||||
def __init__(self, *args, tags=None, **kwargs):
|
||||
tags = tags or []
|
||||
self.args = args
|
||||
self.kwargs = kwargs
|
||||
if tags:
|
||||
for t in tags:
|
||||
options[t].append(self)
|
||||
else:
|
||||
options["*"].append(self)
|
||||
|
||||
def add_to(self, parser: argparse.ArgumentParser):
|
||||
parser.add_argument(*self.args, **self.kwargs)
|
||||
|
||||
|
||||
Option("--check", "-c", action="store_true")
|
||||
Option("--verbose", "-v", action="store_true")
|
||||
Option("--schema", tags=["schema"], type=pathlib.Path, default=paths.swift_dir / "codegen/schema.yml")
|
||||
Option("--dbscheme", tags=["dbscheme"], type=pathlib.Path, default=paths.swift_dir / "ql/lib/swift.dbscheme")
|
||||
|
||||
|
||||
def _parse(*tags):
|
||||
parser = argparse.ArgumentParser()
|
||||
if not tags:
|
||||
opts = [o for os in options.values() for o in os]
|
||||
else:
|
||||
opts = options["*"]
|
||||
for t in tags:
|
||||
opts.extend(options[t])
|
||||
for opt in opts:
|
||||
opt.add_to(parser)
|
||||
ret = parser.parse_args()
|
||||
log_level = logging.DEBUG if ret.verbose else logging.INFO
|
||||
logging.basicConfig(format="{levelname} {message}", style='{', level=log_level)
|
||||
return ret
|
||||
|
||||
|
||||
def run(*generate, tags=()):
|
||||
opts = _parse(*tags)
|
||||
done_something = False
|
||||
for g in generate:
|
||||
if g(opts):
|
||||
done_something = True
|
||||
sys.exit(1 if opts.check and done_something else 0)
|
|
@ -0,0 +1,15 @@
|
|||
import pathlib
|
||||
import sys
|
||||
import os
|
||||
|
||||
try:
|
||||
_workspace_dir = pathlib.Path(os.environ['BUILD_WORKSPACE_DIRECTORY'])
|
||||
swift_dir = _workspace_dir / 'swift'
|
||||
lib_dir = swift_dir / 'codegen' / 'lib'
|
||||
except KeyError:
|
||||
_this_file = pathlib.Path(__file__).resolve()
|
||||
swift_dir = _this_file.parents[2]
|
||||
lib_dir = _this_file.parent
|
||||
|
||||
|
||||
exe_file = pathlib.Path(sys.argv[0]).resolve()
|
|
@ -0,0 +1,59 @@
|
|||
import hashlib
|
||||
import logging
|
||||
|
||||
import pystache
|
||||
|
||||
from . import paths
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def md5(data):
|
||||
return hashlib.md5(data).digest()
|
||||
|
||||
|
||||
class Renderer:
|
||||
def __init__(self, check=False):
|
||||
self.r = pystache.Renderer(search_dirs=str(paths.lib_dir / "templates"), escape=lambda u: u)
|
||||
self.generator = paths.exe_file.relative_to(paths.swift_dir)
|
||||
self.check = check
|
||||
self.written = set()
|
||||
self.skipped = set()
|
||||
self.erased = set()
|
||||
|
||||
@property
|
||||
def done_something(self):
|
||||
return bool(self.written or self.erased)
|
||||
|
||||
@property
|
||||
def rendered(self):
|
||||
return self.written | self.skipped
|
||||
|
||||
def render(self, name, output, **data):
|
||||
mnemonic, _, _ = name.lower().partition(".")
|
||||
output.parent.mkdir(parents=True, exist_ok=True)
|
||||
data["generator"] = self.generator
|
||||
data = self.r.render_name(name, data)
|
||||
if output.is_file():
|
||||
with open(output, "rb") as file:
|
||||
if md5(data.encode()) == md5(file.read()):
|
||||
log.debug(f"skipped {output.name}")
|
||||
self.skipped.add(output)
|
||||
return
|
||||
if self.check:
|
||||
log.error(f"would have generated {mnemonic} {output.name}")
|
||||
else:
|
||||
with open(output, "w") as out:
|
||||
out.write(data)
|
||||
log.info(f"generated {mnemonic} {output.name}")
|
||||
self.written.add(output)
|
||||
|
||||
def cleanup(self, existing):
|
||||
for f in existing - self.written - self.skipped:
|
||||
if f.is_file():
|
||||
if self.check:
|
||||
log.error(f"would have removed {f.name}")
|
||||
else:
|
||||
f.unlink()
|
||||
log.info(f"removed {f.name}")
|
||||
self.erased.add(f)
|
|
@ -0,0 +1,98 @@
|
|||
import pathlib
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum, auto
|
||||
from typing import List, Set, Dict
|
||||
import re
|
||||
|
||||
import yaml
|
||||
|
||||
|
||||
class Cardinality(Enum):
|
||||
ONE = auto()
|
||||
OPTIONAL = auto()
|
||||
MANY = auto()
|
||||
|
||||
|
||||
@dataclass
|
||||
class Field:
|
||||
name: str
|
||||
type: str
|
||||
cardinality: Cardinality = Cardinality.ONE
|
||||
|
||||
def is_single(self):
|
||||
return self.cardinality == Cardinality.ONE
|
||||
|
||||
def is_optional(self):
|
||||
return self.cardinality == Cardinality.OPTIONAL
|
||||
|
||||
def is_repeated(self):
|
||||
return self.cardinality == Cardinality.MANY
|
||||
|
||||
|
||||
@dataclass
|
||||
class Class:
|
||||
name: str
|
||||
bases: Set[str] = field(default_factory=set)
|
||||
derived: Set[str] = field(default_factory=set)
|
||||
fields: List[Field] = field(default_factory=list)
|
||||
dir: pathlib.Path = pathlib.Path()
|
||||
|
||||
|
||||
@dataclass
|
||||
class Schema:
|
||||
classes: Dict[str, Class]
|
||||
includes: Set[str] = field(default_factory=set)
|
||||
|
||||
|
||||
def _parse_field(name, type):
|
||||
if type.endswith("*"):
|
||||
cardinality = Cardinality.MANY
|
||||
type = type[:-1]
|
||||
elif type.endswith("?"):
|
||||
cardinality = Cardinality.OPTIONAL
|
||||
type = type[:-1]
|
||||
else:
|
||||
cardinality = Cardinality.ONE
|
||||
return Field(name, type, cardinality)
|
||||
|
||||
|
||||
root_class_name = "Element"
|
||||
|
||||
|
||||
class DirSelector:
|
||||
def __init__(self, dir_to_patterns):
|
||||
self.selector = [(re.compile(p), pathlib.Path(d)) for d, p in dir_to_patterns]
|
||||
self.selector.append((re.compile(""), pathlib.Path()))
|
||||
|
||||
def get(self, name):
|
||||
return next(d for p, d in self.selector if p.search(name))
|
||||
|
||||
|
||||
def load(file):
|
||||
data = yaml.load(file, Loader=yaml.SafeLoader)
|
||||
grouper = DirSelector(data.get("_directories", {}).items())
|
||||
ret = Schema(classes={cls: Class(cls, dir=grouper.get(cls)) for cls in data if not cls.startswith("_")},
|
||||
includes=set(data.get("_includes", [])))
|
||||
assert root_class_name not in ret.classes
|
||||
ret.classes[root_class_name] = Class(root_class_name)
|
||||
for name, info in data.items():
|
||||
if name.startswith("_"):
|
||||
continue
|
||||
assert name[0].isupper()
|
||||
cls = ret.classes[name]
|
||||
for k, v in info.items():
|
||||
if not k.startswith("_"):
|
||||
cls.fields.append(_parse_field(k, v))
|
||||
elif k == "_extends":
|
||||
if not isinstance(v, list):
|
||||
v = [v]
|
||||
for base in v:
|
||||
cls.bases.add(base)
|
||||
ret.classes[base].derived.add(name)
|
||||
elif k == "_dir":
|
||||
cls.dir = pathlib.Path(v)
|
||||
if not cls.bases:
|
||||
cls.bases.add(root_class_name)
|
||||
ret.classes[root_class_name].derived.add(name)
|
||||
|
||||
return ret
|
|
@ -0,0 +1,25 @@
|
|||
// generated by {{generator}}
|
||||
{{#includes}}
|
||||
|
||||
// from {{src}}
|
||||
{{data}}
|
||||
{{/includes}}
|
||||
|
||||
// from {{src}}
|
||||
{{#declarations}}
|
||||
|
||||
{{#is_union}}
|
||||
{{lhs}} =
|
||||
{{#rhs}}
|
||||
{{#first}} {{/first}}{{^first}}| {{/first}}{{type}}
|
||||
{{/rhs}};
|
||||
{{/is_union}}
|
||||
{{#is_table}}
|
||||
{{#keyset}}
|
||||
#keyset[{{#ids}}{{^first}}, {{/first}}{{id}}{{/ids}}]
|
||||
{{/keyset}}
|
||||
{{name}}({{#columns}}{{^first}},{{/first}}
|
||||
{{lhstype}} {{name}}: {{rhstype}}{{/columns}}
|
||||
);
|
||||
{{/is_table}}
|
||||
{{/declarations}}
|
|
@ -0,0 +1,6 @@
|
|||
/**
|
||||
* The source location of the snapshot.
|
||||
*/
|
||||
sourceLocationPrefix(
|
||||
string prefix: string ref
|
||||
);
|
|
@ -0,0 +1,3 @@
|
|||
pystache
|
||||
pyyaml
|
||||
inflection
|
|
@ -0,0 +1,997 @@
|
|||
# add dbscheme files to be added verbatim
|
||||
_includes:
|
||||
- prefix.dbscheme
|
||||
|
||||
# organize generated class files in subdirectories according to these regexp rules
|
||||
# a class can override this specifying `_dir`
|
||||
_directories:
|
||||
decl: Decl$|Context$
|
||||
pattern: Pattern$
|
||||
type: Type$
|
||||
typerepr: TypeRepr$
|
||||
expr: Expr$
|
||||
stmt: Stmt$
|
||||
|
||||
File:
|
||||
name: string
|
||||
|
||||
IterableDeclContext:
|
||||
members: Decl*
|
||||
|
||||
Locatable:
|
||||
location: Location
|
||||
|
||||
Location:
|
||||
file: File
|
||||
begin_line: int
|
||||
begin_column: int
|
||||
end_line: int
|
||||
end_column: int
|
||||
|
||||
Type:
|
||||
diagnostics_name: string
|
||||
canonical_type: Type
|
||||
|
||||
ExtensionDecl:
|
||||
_extends:
|
||||
- GenericContext
|
||||
- IterableDeclContext
|
||||
- Decl
|
||||
|
||||
NominalTypeDecl:
|
||||
_extends:
|
||||
- IterableDeclContext
|
||||
- GenericTypeDecl
|
||||
type: Type
|
||||
|
||||
AstNode:
|
||||
_extends: Locatable
|
||||
|
||||
ConditionElement:
|
||||
_extends: Locatable
|
||||
boolean: Expr?
|
||||
pattern: Pattern?
|
||||
initializer: Expr?
|
||||
_dir: stmt
|
||||
|
||||
AnyFunctionType:
|
||||
_extends: Type
|
||||
result: Type
|
||||
param_types: Type*
|
||||
param_labels: string*
|
||||
|
||||
AnyGenericType:
|
||||
_extends: Type
|
||||
parent: Type?
|
||||
declaration: Decl
|
||||
|
||||
AnyMetatypeType:
|
||||
_extends: Type
|
||||
|
||||
BuiltinType:
|
||||
_extends: Type
|
||||
|
||||
DependentMemberType:
|
||||
_extends: Type
|
||||
|
||||
DynamicSelfType:
|
||||
_extends: Type
|
||||
|
||||
ErrorType:
|
||||
_extends: Type
|
||||
|
||||
InOutType:
|
||||
_extends: Type
|
||||
|
||||
LValueType:
|
||||
_extends: Type
|
||||
object_type: Type
|
||||
|
||||
ModuleType:
|
||||
_extends: Type
|
||||
|
||||
PlaceholderType:
|
||||
_extends: Type
|
||||
|
||||
ProtocolCompositionType:
|
||||
_extends: Type
|
||||
|
||||
ExistentialType:
|
||||
_extends: Type
|
||||
|
||||
ReferenceStorageType:
|
||||
_extends: Type
|
||||
|
||||
SilBlockStorageType:
|
||||
_extends: Type
|
||||
|
||||
SilBoxType:
|
||||
_extends: Type
|
||||
|
||||
SilFunctionType:
|
||||
_extends: Type
|
||||
|
||||
SilTokenType:
|
||||
_extends: Type
|
||||
|
||||
SubstitutableType:
|
||||
_extends: Type
|
||||
|
||||
SugarType:
|
||||
_extends: Type
|
||||
|
||||
TupleType:
|
||||
_extends: Type
|
||||
|
||||
TypeVariableType:
|
||||
_extends: Type
|
||||
|
||||
UnknownType:
|
||||
_extends: Type
|
||||
name: string
|
||||
|
||||
UnresolvedType:
|
||||
_extends: Type
|
||||
|
||||
ClassDecl:
|
||||
_extends: NominalTypeDecl
|
||||
|
||||
EnumDecl:
|
||||
_extends: NominalTypeDecl
|
||||
|
||||
ProtocolDecl:
|
||||
_extends: NominalTypeDecl
|
||||
|
||||
StructDecl:
|
||||
_extends: NominalTypeDecl
|
||||
|
||||
Decl:
|
||||
_extends: AstNode
|
||||
|
||||
Expr:
|
||||
_extends: AstNode
|
||||
type: Type?
|
||||
|
||||
Pattern:
|
||||
_extends: AstNode
|
||||
|
||||
Stmt:
|
||||
_extends: AstNode
|
||||
|
||||
TypeRepr:
|
||||
_extends: AstNode
|
||||
|
||||
FunctionType:
|
||||
_extends: AnyFunctionType
|
||||
|
||||
GenericFunctionType:
|
||||
_extends: AnyFunctionType
|
||||
generic_params: GenericTypeParamType*
|
||||
|
||||
NominalOrBoundGenericNominalType:
|
||||
_extends: AnyGenericType
|
||||
|
||||
UnboundGenericType:
|
||||
_extends: AnyGenericType
|
||||
|
||||
ExistentialMetatypeType:
|
||||
_extends: AnyMetatypeType
|
||||
|
||||
MetatypeType:
|
||||
_extends: AnyMetatypeType
|
||||
|
||||
AnyBuiltinIntegerType:
|
||||
_extends: BuiltinType
|
||||
|
||||
BuiltinBridgeObjectType:
|
||||
_extends: BuiltinType
|
||||
|
||||
BuiltinDefaultActorStorageType:
|
||||
_extends: BuiltinType
|
||||
|
||||
BuiltinExecutorType:
|
||||
_extends: BuiltinType
|
||||
|
||||
BuiltinFloatType:
|
||||
_extends: BuiltinType
|
||||
|
||||
BuiltinJobType:
|
||||
_extends: BuiltinType
|
||||
|
||||
BuiltinNativeObjectType:
|
||||
_extends: BuiltinType
|
||||
|
||||
BuiltinRawPointerType:
|
||||
_extends: BuiltinType
|
||||
|
||||
BuiltinRawUnsafeContinuationType:
|
||||
_extends: BuiltinType
|
||||
|
||||
BuiltinUnsafeValueBufferType:
|
||||
_extends: BuiltinType
|
||||
|
||||
BuiltinVectorType:
|
||||
_extends: BuiltinType
|
||||
|
||||
UnmanagedStorageType:
|
||||
_extends: ReferenceStorageType
|
||||
|
||||
UnownedStorageType:
|
||||
_extends: ReferenceStorageType
|
||||
|
||||
WeakStorageType:
|
||||
_extends: ReferenceStorageType
|
||||
|
||||
ArchetypeType:
|
||||
_extends: SubstitutableType
|
||||
|
||||
GenericTypeParamType:
|
||||
_extends: SubstitutableType
|
||||
name: string
|
||||
|
||||
ParenType:
|
||||
_extends: SugarType
|
||||
|
||||
SyntaxSugarType:
|
||||
_extends: SugarType
|
||||
|
||||
TypeAliasType:
|
||||
_extends: SugarType
|
||||
|
||||
EnumCaseDecl:
|
||||
_extends: Decl
|
||||
elements: EnumElementDecl*
|
||||
|
||||
IfConfigDecl:
|
||||
_extends: Decl
|
||||
|
||||
ImportDecl:
|
||||
_extends: Decl
|
||||
|
||||
MissingMemberDecl:
|
||||
_extends: Decl
|
||||
|
||||
OperatorDecl:
|
||||
_extends: Decl
|
||||
|
||||
PatternBindingDecl:
|
||||
_extends: Decl
|
||||
inits: Expr*
|
||||
patterns: Pattern*
|
||||
|
||||
PoundDiagnosticDecl:
|
||||
_extends: Decl
|
||||
|
||||
PrecedenceGroupDecl:
|
||||
_extends: Decl
|
||||
|
||||
TopLevelCodeDecl:
|
||||
_extends: Decl
|
||||
body: BraceStmt
|
||||
|
||||
UnknownAstNode:
|
||||
_extends:
|
||||
- Decl
|
||||
- Expr
|
||||
- Pattern
|
||||
- Stmt
|
||||
- TypeRepr
|
||||
name: string
|
||||
|
||||
ValueDecl:
|
||||
_extends: Decl
|
||||
interface_type: Type
|
||||
|
||||
AbstractClosureExpr:
|
||||
_extends: Expr
|
||||
|
||||
AnyTryExpr:
|
||||
_extends: Expr
|
||||
sub_expr: Expr
|
||||
|
||||
AppliedPropertyWrapperExpr:
|
||||
_extends: Expr
|
||||
|
||||
Argument:
|
||||
label: string
|
||||
expr: Expr
|
||||
_dir: expr
|
||||
|
||||
ApplyExpr:
|
||||
_extends: Expr
|
||||
function: Expr
|
||||
arguments: Argument*
|
||||
|
||||
ArrowExpr:
|
||||
_extends: Expr
|
||||
|
||||
AssignExpr:
|
||||
_extends: Expr
|
||||
dest: Expr
|
||||
src: Expr
|
||||
|
||||
BindOptionalExpr:
|
||||
_extends: Expr
|
||||
|
||||
CaptureListExpr:
|
||||
_extends: Expr
|
||||
|
||||
CodeCompletionExpr:
|
||||
_extends: Expr
|
||||
|
||||
CollectionExpr:
|
||||
_extends: Expr
|
||||
|
||||
DeclRefExpr:
|
||||
_extends: Expr
|
||||
decl: Decl
|
||||
replacement_types: Type*
|
||||
|
||||
DefaultArgumentExpr:
|
||||
_extends: Expr
|
||||
param_decl: ParamDecl
|
||||
param_index: int
|
||||
caller_side_default: Expr?
|
||||
|
||||
DiscardAssignmentExpr:
|
||||
_extends: Expr
|
||||
|
||||
DotSyntaxBaseIgnoredExpr:
|
||||
_extends: Expr
|
||||
|
||||
DynamicTypeExpr:
|
||||
_extends: Expr
|
||||
|
||||
EditorPlaceholderExpr:
|
||||
_extends: Expr
|
||||
|
||||
EnumIsCaseExpr:
|
||||
_extends: Expr
|
||||
|
||||
ErrorExpr:
|
||||
_extends: Expr
|
||||
|
||||
ExplicitCastExpr:
|
||||
_extends: Expr
|
||||
sub_expr: Expr
|
||||
|
||||
ForceValueExpr:
|
||||
_extends: Expr
|
||||
sub_expr: Expr
|
||||
|
||||
IdentityExpr:
|
||||
_extends: Expr
|
||||
sub_expr: Expr
|
||||
|
||||
IfExpr:
|
||||
_extends: Expr
|
||||
|
||||
ImplicitConversionExpr:
|
||||
_extends: Expr
|
||||
sub_expr: Expr
|
||||
|
||||
InOutExpr:
|
||||
_extends: Expr
|
||||
sub_expr: Expr
|
||||
|
||||
KeyPathApplicationExpr:
|
||||
_extends: Expr
|
||||
|
||||
KeyPathDotExpr:
|
||||
_extends: Expr
|
||||
|
||||
KeyPathExpr:
|
||||
_extends: Expr
|
||||
parsed_root: Expr?
|
||||
parsed_path: Expr?
|
||||
|
||||
LazyInitializerExpr:
|
||||
_extends: Expr
|
||||
|
||||
LiteralExpr:
|
||||
_extends: Expr
|
||||
|
||||
LookupExpr:
|
||||
_extends: Expr
|
||||
|
||||
MakeTemporarilyEscapableExpr:
|
||||
_extends: Expr
|
||||
|
||||
ObjCSelectorExpr:
|
||||
_extends: Expr
|
||||
|
||||
OneWayExpr:
|
||||
_extends: Expr
|
||||
|
||||
OpaqueValueExpr:
|
||||
_extends: Expr
|
||||
|
||||
OpenExistentialExpr:
|
||||
_extends: Expr
|
||||
|
||||
OptionalEvaluationExpr:
|
||||
_extends: Expr
|
||||
|
||||
OtherConstructorDeclRefExpr:
|
||||
_extends: Expr
|
||||
|
||||
OverloadSetRefExpr:
|
||||
_extends: Expr
|
||||
|
||||
PropertyWrapperValuePlaceholderExpr:
|
||||
_extends: Expr
|
||||
|
||||
RebindSelfInConstructorExpr:
|
||||
_extends: Expr
|
||||
|
||||
SequenceExpr:
|
||||
_extends: Expr
|
||||
|
||||
SuperRefExpr:
|
||||
_extends: Expr
|
||||
|
||||
TapExpr:
|
||||
_extends: Expr
|
||||
sub_expr: Expr?
|
||||
var: VarDecl
|
||||
body: BraceStmt
|
||||
|
||||
TupleElementExpr:
|
||||
_extends: Expr
|
||||
|
||||
TupleExpr:
|
||||
_extends: Expr
|
||||
elements: Expr*
|
||||
|
||||
TypeExpr:
|
||||
_extends: Expr
|
||||
type_repr: UnknownAstNode?
|
||||
|
||||
UnresolvedDeclRefExpr:
|
||||
_extends: Expr
|
||||
|
||||
UnresolvedDotExpr:
|
||||
_extends: Expr
|
||||
|
||||
UnresolvedMemberExpr:
|
||||
_extends: Expr
|
||||
|
||||
UnresolvedPatternExpr:
|
||||
_extends: Expr
|
||||
|
||||
UnresolvedSpecializeExpr:
|
||||
_extends: Expr
|
||||
|
||||
VarargExpansionExpr:
|
||||
_extends: Expr
|
||||
sub_expr: Expr
|
||||
|
||||
AnyPattern:
|
||||
_extends: Pattern
|
||||
|
||||
BindingPattern:
|
||||
_extends: Pattern
|
||||
sub_pattern: Pattern
|
||||
|
||||
BoolPattern:
|
||||
_extends: Pattern
|
||||
value: boolean
|
||||
|
||||
EnumElementPattern:
|
||||
_extends: Pattern
|
||||
element: EnumElementDecl
|
||||
sub_pattern: Pattern?
|
||||
|
||||
ExprPattern:
|
||||
_extends: Pattern
|
||||
sub_expr: Expr
|
||||
|
||||
IsPattern:
|
||||
_extends: Pattern
|
||||
cast_type_repr: TypeRepr
|
||||
sub_pattern: Pattern?
|
||||
|
||||
NamedPattern:
|
||||
_extends: Pattern
|
||||
name: string
|
||||
|
||||
OptionalSomePattern:
|
||||
_extends: Pattern
|
||||
sub_pattern: Pattern
|
||||
|
||||
ParenPattern:
|
||||
_extends: Pattern
|
||||
sub_pattern: Pattern
|
||||
|
||||
TuplePattern:
|
||||
_extends: Pattern
|
||||
elements: Pattern*
|
||||
|
||||
TypedPattern:
|
||||
_extends: Pattern
|
||||
sub_pattern: Pattern
|
||||
type_repr: TypeRepr?
|
||||
|
||||
BraceStmt:
|
||||
_extends: Stmt
|
||||
elements: AstNode*
|
||||
|
||||
BreakStmt:
|
||||
_extends: Stmt
|
||||
target_name: string?
|
||||
target: Stmt?
|
||||
|
||||
CaseStmt:
|
||||
_extends: Stmt
|
||||
body: Stmt
|
||||
labels: CaseLabelItem*
|
||||
variables: VarDecl*
|
||||
|
||||
CaseLabelItem:
|
||||
_extends: AstNode
|
||||
pattern: Pattern
|
||||
guard: Expr?
|
||||
_dir: stmt
|
||||
|
||||
ContinueStmt:
|
||||
_extends: Stmt
|
||||
target_name: string?
|
||||
target: Stmt?
|
||||
|
||||
DeferStmt:
|
||||
_extends: Stmt
|
||||
body: BraceStmt
|
||||
|
||||
FailStmt:
|
||||
_extends: Stmt
|
||||
|
||||
FallthroughStmt:
|
||||
_extends: Stmt
|
||||
fallthrough_source: CaseStmt
|
||||
fallthrough_dest: CaseStmt
|
||||
|
||||
LabeledStmt:
|
||||
_extends: Stmt
|
||||
label: string?
|
||||
|
||||
PoundAssertStmt:
|
||||
_extends: Stmt
|
||||
|
||||
ReturnStmt:
|
||||
_extends: Stmt
|
||||
result: Expr?
|
||||
|
||||
ThrowStmt:
|
||||
_extends: Stmt
|
||||
sub_expr: Expr
|
||||
|
||||
YieldStmt:
|
||||
_extends: Stmt
|
||||
|
||||
BoundGenericType:
|
||||
_extends: NominalOrBoundGenericNominalType
|
||||
|
||||
NominalType:
|
||||
_extends: NominalOrBoundGenericNominalType
|
||||
|
||||
BuiltinIntegerLiteralType:
|
||||
_extends: AnyBuiltinIntegerType
|
||||
|
||||
BuiltinIntegerType:
|
||||
_extends: AnyBuiltinIntegerType
|
||||
|
||||
NestedArchetypeType:
|
||||
_extends: ArchetypeType
|
||||
|
||||
SequenceArchetypeType:
|
||||
_extends: ArchetypeType
|
||||
|
||||
OpaqueTypeArchetypeType:
|
||||
_extends: ArchetypeType
|
||||
|
||||
OpenedArchetypeType:
|
||||
_extends: ArchetypeType
|
||||
|
||||
PrimaryArchetypeType:
|
||||
_extends: ArchetypeType
|
||||
interface_type: GenericTypeParamType
|
||||
|
||||
DictionaryType:
|
||||
_extends: SyntaxSugarType
|
||||
|
||||
UnarySyntaxSugarType:
|
||||
_extends: SyntaxSugarType
|
||||
|
||||
InfixOperatorDecl:
|
||||
_extends: OperatorDecl
|
||||
|
||||
PostfixOperatorDecl:
|
||||
_extends: OperatorDecl
|
||||
|
||||
PrefixOperatorDecl:
|
||||
_extends: OperatorDecl
|
||||
|
||||
AbstractFunctionDecl:
|
||||
_extends:
|
||||
- GenericContext
|
||||
- ValueDecl
|
||||
name: string
|
||||
body: BraceStmt?
|
||||
params: ParamDecl*
|
||||
|
||||
AbstractStorageDecl:
|
||||
_extends: ValueDecl
|
||||
|
||||
EnumElementDecl:
|
||||
_extends: ValueDecl
|
||||
name: string
|
||||
params: ParamDecl*
|
||||
|
||||
TypeDecl:
|
||||
_extends: ValueDecl
|
||||
name: string
|
||||
|
||||
AutoClosureExpr:
|
||||
_extends: AbstractClosureExpr
|
||||
|
||||
ClosureExpr:
|
||||
_extends: AbstractClosureExpr
|
||||
body: BraceStmt
|
||||
|
||||
ForceTryExpr:
|
||||
_extends: AnyTryExpr
|
||||
|
||||
OptionalTryExpr:
|
||||
_extends: AnyTryExpr
|
||||
|
||||
TryExpr:
|
||||
_extends: AnyTryExpr
|
||||
|
||||
BinaryExpr:
|
||||
_extends: ApplyExpr
|
||||
|
||||
CallExpr:
|
||||
_extends: ApplyExpr
|
||||
|
||||
PostfixUnaryExpr:
|
||||
_extends: ApplyExpr
|
||||
|
||||
PrefixUnaryExpr:
|
||||
_extends: ApplyExpr
|
||||
|
||||
SelfApplyExpr:
|
||||
_extends: ApplyExpr
|
||||
base: Expr
|
||||
|
||||
ArrayExpr:
|
||||
_extends: CollectionExpr
|
||||
elements: Expr*
|
||||
|
||||
DictionaryExpr:
|
||||
_extends: CollectionExpr
|
||||
elements: Expr*
|
||||
|
||||
CheckedCastExpr:
|
||||
_extends: ExplicitCastExpr
|
||||
|
||||
CoerceExpr:
|
||||
_extends: ExplicitCastExpr
|
||||
|
||||
AwaitExpr:
|
||||
_extends: IdentityExpr
|
||||
|
||||
DotSelfExpr:
|
||||
_extends: IdentityExpr
|
||||
|
||||
ParenExpr:
|
||||
_extends: IdentityExpr
|
||||
|
||||
UnresolvedMemberChainResultExpr:
|
||||
_extends: IdentityExpr
|
||||
|
||||
AnyHashableErasureExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
ArchetypeToSuperExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
ArrayToPointerExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
BridgeFromObjCExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
BridgeToObjCExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
ClassMetatypeToObjectExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
CollectionUpcastConversionExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
ConditionalBridgeFromObjCExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
CovariantFunctionConversionExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
CovariantReturnConversionExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
DerivedToBaseExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
DestructureTupleExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
DifferentiableFunctionExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
DifferentiableFunctionExtractOriginalExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
ErasureExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
ExistentialMetatypeToObjectExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
ForeignObjectConversionExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
FunctionConversionExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
InOutToPointerExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
InjectIntoOptionalExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
LinearFunctionExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
LinearFunctionExtractOriginalExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
LinearToDifferentiableFunctionExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
LoadExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
MetatypeConversionExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
PointerToPointerExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
ProtocolMetatypeToObjectExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
StringToPointerExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
UnderlyingToOpaqueExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
UnevaluatedInstanceExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
UnresolvedTypeConversionExpr:
|
||||
_extends: ImplicitConversionExpr
|
||||
|
||||
BuiltinLiteralExpr:
|
||||
_extends: LiteralExpr
|
||||
|
||||
InterpolatedStringLiteralExpr:
|
||||
_extends: LiteralExpr
|
||||
interpolation_expr: OpaqueValueExpr?
|
||||
interpolation_count_expr: Expr?
|
||||
literal_capacity_expr: Expr?
|
||||
appending_expr: TapExpr?
|
||||
|
||||
RegexLiteralExpr:
|
||||
_extends: LiteralExpr
|
||||
|
||||
NilLiteralExpr:
|
||||
_extends: LiteralExpr
|
||||
|
||||
ObjectLiteralExpr:
|
||||
_extends: LiteralExpr
|
||||
|
||||
DynamicLookupExpr:
|
||||
_extends: LookupExpr
|
||||
|
||||
MemberRefExpr:
|
||||
_extends: LookupExpr
|
||||
base_expr: Expr
|
||||
|
||||
SubscriptExpr:
|
||||
_extends:
|
||||
- GenericContext
|
||||
- LookupExpr
|
||||
base_expr: Expr
|
||||
arguments: Argument*
|
||||
|
||||
OverloadedDeclRefExpr:
|
||||
_extends: OverloadSetRefExpr
|
||||
|
||||
DoCatchStmt:
|
||||
_extends: LabeledStmt
|
||||
body: Stmt
|
||||
catches: CaseStmt*
|
||||
|
||||
DoStmt:
|
||||
_extends: LabeledStmt
|
||||
body: BraceStmt
|
||||
|
||||
ForEachStmt:
|
||||
_extends: LabeledStmt
|
||||
body: BraceStmt
|
||||
where: Expr?
|
||||
|
||||
LabeledConditionalStmt:
|
||||
_extends: LabeledStmt
|
||||
condition: StmtCondition
|
||||
|
||||
StmtCondition:
|
||||
_extends: AstNode
|
||||
elements: ConditionElement*
|
||||
_dir: stmt
|
||||
|
||||
RepeatWhileStmt:
|
||||
_extends: LabeledStmt
|
||||
cond: Expr
|
||||
body: Stmt
|
||||
|
||||
SwitchStmt:
|
||||
_extends: LabeledStmt
|
||||
subject_expr: Expr
|
||||
cases: CaseStmt*
|
||||
|
||||
BoundGenericClassType:
|
||||
_extends: BoundGenericType
|
||||
|
||||
BoundGenericEnumType:
|
||||
_extends: BoundGenericType
|
||||
|
||||
BoundGenericStructType:
|
||||
_extends: BoundGenericType
|
||||
|
||||
ClassType:
|
||||
_extends: NominalType
|
||||
decl: ClassDecl
|
||||
|
||||
EnumType:
|
||||
_extends: NominalType
|
||||
|
||||
ProtocolType:
|
||||
_extends: NominalType
|
||||
|
||||
StructType:
|
||||
_extends: NominalType
|
||||
decl: StructDecl
|
||||
|
||||
ArraySliceType:
|
||||
_extends: UnarySyntaxSugarType
|
||||
|
||||
OptionalType:
|
||||
_extends: UnarySyntaxSugarType
|
||||
|
||||
VariadicSequenceType:
|
||||
_extends: UnarySyntaxSugarType
|
||||
|
||||
ConstructorDecl:
|
||||
_extends: AbstractFunctionDecl
|
||||
|
||||
DestructorDecl:
|
||||
_extends: AbstractFunctionDecl
|
||||
|
||||
FuncDecl:
|
||||
_extends: AbstractFunctionDecl
|
||||
|
||||
SubscriptDecl:
|
||||
_extends: AbstractStorageDecl
|
||||
|
||||
VarDecl:
|
||||
_extends: AbstractStorageDecl
|
||||
name: string
|
||||
type: Type
|
||||
|
||||
AbstractTypeParamDecl:
|
||||
_extends: TypeDecl
|
||||
|
||||
GenericContext:
|
||||
generic_type_params: GenericTypeParamDecl*
|
||||
|
||||
GenericTypeDecl:
|
||||
_extends:
|
||||
- GenericContext
|
||||
- TypeDecl
|
||||
|
||||
ModuleDecl:
|
||||
_extends: TypeDecl
|
||||
|
||||
ConstructorRefCallExpr:
|
||||
_extends: SelfApplyExpr
|
||||
|
||||
DotSyntaxCallExpr:
|
||||
_extends: SelfApplyExpr
|
||||
|
||||
ConditionalCheckedCastExpr:
|
||||
_extends: CheckedCastExpr
|
||||
|
||||
ForcedCheckedCastExpr:
|
||||
_extends: CheckedCastExpr
|
||||
|
||||
IsExpr:
|
||||
_extends: CheckedCastExpr
|
||||
|
||||
BooleanLiteralExpr:
|
||||
_extends: BuiltinLiteralExpr
|
||||
value: boolean
|
||||
|
||||
MagicIdentifierLiteralExpr:
|
||||
_extends: BuiltinLiteralExpr
|
||||
kind: string
|
||||
|
||||
NumberLiteralExpr:
|
||||
_extends: BuiltinLiteralExpr
|
||||
|
||||
StringLiteralExpr:
|
||||
_extends: BuiltinLiteralExpr
|
||||
value: string
|
||||
|
||||
DynamicMemberRefExpr:
|
||||
_extends: DynamicLookupExpr
|
||||
|
||||
DynamicSubscriptExpr:
|
||||
_extends: DynamicLookupExpr
|
||||
|
||||
GuardStmt:
|
||||
_extends: LabeledConditionalStmt
|
||||
body: BraceStmt
|
||||
|
||||
IfStmt:
|
||||
_extends: LabeledConditionalStmt
|
||||
then: Stmt
|
||||
else: Stmt?
|
||||
|
||||
WhileStmt:
|
||||
_extends: LabeledConditionalStmt
|
||||
body: Stmt
|
||||
|
||||
AccessorDecl:
|
||||
_extends: FuncDecl
|
||||
|
||||
ConcreteFuncDecl:
|
||||
_extends: FuncDecl
|
||||
|
||||
ConcreteVarDecl:
|
||||
_extends: VarDecl
|
||||
introducer_int: int
|
||||
|
||||
ParamDecl:
|
||||
_extends: VarDecl
|
||||
|
||||
AssociatedTypeDecl:
|
||||
_extends: AbstractTypeParamDecl
|
||||
|
||||
GenericTypeParamDecl:
|
||||
_extends: AbstractTypeParamDecl
|
||||
|
||||
OpaqueTypeDecl:
|
||||
_extends: GenericTypeDecl
|
||||
|
||||
TypeAliasDecl:
|
||||
_extends: GenericTypeDecl
|
||||
|
||||
FloatLiteralExpr:
|
||||
_extends: NumberLiteralExpr
|
||||
string_value: string
|
||||
|
||||
IntegerLiteralExpr:
|
||||
_extends: NumberLiteralExpr
|
||||
string_value: string
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Загрузка…
Ссылка в новой задаче