sealed classes for java17
This commit is contained in:
parent
599c05f320
commit
f1d5343760
55
__main__.py
55
__main__.py
@ -27,6 +27,10 @@ cmp_natives.remove("String")
|
|||||||
cmp_natives.remove("byte[]")
|
cmp_natives.remove("byte[]")
|
||||||
|
|
||||||
|
|
||||||
|
def chunker(seq, size):
|
||||||
|
return (seq[pos:pos + size] for pos in range(0, len(seq), size))
|
||||||
|
|
||||||
|
|
||||||
def split_docs(docs: typing.List[str]) -> typing.List[str]:
|
def split_docs(docs: typing.List[str]) -> typing.List[str]:
|
||||||
tokens = " ".join(docs).split(" ")
|
tokens = " ".join(docs).split(" ")
|
||||||
result = [tokens[0]]
|
result = [tokens[0]]
|
||||||
@ -301,9 +305,11 @@ def serialize_native(output: CodeWriter, arg_type: str, arg_name: str, null_chec
|
|||||||
output.close_block(space=True)
|
output.close_block(space=True)
|
||||||
|
|
||||||
|
|
||||||
def main(input_path: str, output_path: str, headers_path: str):
|
def main(input_path: str, output_path: str, headers_path: str, java17: str):
|
||||||
data_input = open(input_path)
|
data_input = open(input_path)
|
||||||
|
|
||||||
|
java17 = java17 == "true"
|
||||||
|
|
||||||
package: typing.Optional[str] = None
|
package: typing.Optional[str] = None
|
||||||
current_constructor: typing.Optional[int] = None
|
current_constructor: typing.Optional[int] = None
|
||||||
current_class_name: typing.Optional[str] = None
|
current_class_name: typing.Optional[str] = None
|
||||||
@ -490,7 +496,27 @@ def main(input_path: str, output_path: str, headers_path: str):
|
|||||||
|
|
||||||
output.newline()
|
output.newline()
|
||||||
output.indent()
|
output.indent()
|
||||||
output.open_custom_block(f"public abstract static class", container_class_name, "extends Object")
|
|
||||||
|
allowed_classess = []
|
||||||
|
|
||||||
|
for classes in (object_classes, function_classes):
|
||||||
|
for class_name, class_meta in classes.items():
|
||||||
|
if container_class_name == class_meta[1]:
|
||||||
|
allowed_classess.append(class_name)
|
||||||
|
|
||||||
|
allowed_classess_str = "permits "
|
||||||
|
|
||||||
|
for i, allowed_classess_group in enumerate(chunker(allowed_classess, 3)):
|
||||||
|
if i:
|
||||||
|
allowed_classess_str += "\n"
|
||||||
|
allowed_classess_str += output.indent_chr * (output.indent_depth + 1)
|
||||||
|
allowed_classess_str += ", ".join(allowed_classess_group)
|
||||||
|
|
||||||
|
if allowed_classess and java17:
|
||||||
|
output.open_custom_block(f"public abstract static sealed class", container_class_name, "extends Object", allowed_classess_str)
|
||||||
|
else:
|
||||||
|
output.open_custom_block(f"public abstract static class", container_class_name, "extends Object")
|
||||||
|
|
||||||
output.close_block()
|
output.close_block()
|
||||||
output.newline()
|
output.newline()
|
||||||
|
|
||||||
@ -519,7 +545,7 @@ def main(input_path: str, output_path: str, headers_path: str):
|
|||||||
class_generics += docs.split("@link ")[1].split()[0]
|
class_generics += docs.split("@link ")[1].split()[0]
|
||||||
class_generics += ">"
|
class_generics += ">"
|
||||||
|
|
||||||
output.open_custom_block("public static class", class_name, "extends", class_meta[1] + class_generics)
|
output.open_custom_block("public static final class", class_name, "extends", class_meta[1] + class_generics)
|
||||||
|
|
||||||
for arg_type, arg_name, docs in class_meta[2]:
|
for arg_type, arg_name, docs in class_meta[2]:
|
||||||
output.newline()
|
output.newline()
|
||||||
@ -572,11 +598,10 @@ def main(input_path: str, output_path: str, headers_path: str):
|
|||||||
output.indent()
|
output.indent()
|
||||||
output.write_docs(doc)
|
output.write_docs(doc)
|
||||||
|
|
||||||
output.newline()
|
|
||||||
output.indent()
|
|
||||||
output.write_docs()
|
|
||||||
|
|
||||||
for arg_name, arg_type, docs in class_meta[2]:
|
for arg_name, arg_type, docs in class_meta[2]:
|
||||||
|
output.newline()
|
||||||
|
output.indent()
|
||||||
|
output.write_docs()
|
||||||
docs = split_docs(docs)
|
docs = split_docs(docs)
|
||||||
output.newline()
|
output.newline()
|
||||||
output.indent()
|
output.indent()
|
||||||
@ -607,6 +632,20 @@ def main(input_path: str, output_path: str, headers_path: str):
|
|||||||
output.close_block(space=True)
|
output.close_block(space=True)
|
||||||
output.newline()
|
output.newline()
|
||||||
|
|
||||||
|
output.indent()
|
||||||
|
output.open_docs()
|
||||||
|
|
||||||
|
for docs in class_meta[3]:
|
||||||
|
for doc in split_docs([docs]):
|
||||||
|
output.newline()
|
||||||
|
output.indent()
|
||||||
|
output.write_docs(doc)
|
||||||
|
|
||||||
|
output.newline()
|
||||||
|
output.indent()
|
||||||
|
output.close_docs()
|
||||||
|
output.newline()
|
||||||
|
|
||||||
output.indent()
|
output.indent()
|
||||||
output.open_constructor_function(class_name, [("DataInput", "input")], "IOException")
|
output.open_constructor_function(class_name, [("DataInput", "input")], "IOException")
|
||||||
output.newline()
|
output.newline()
|
||||||
@ -897,4 +936,4 @@ def main(input_path: str, output_path: str, headers_path: str):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main(sys.argv[-3], sys.argv[-2], sys.argv[-1])
|
main(sys.argv[-4], sys.argv[-3], sys.argv[-2], sys.argv[-1])
|
||||||
|
@ -7,6 +7,23 @@ indent = "\t"
|
|||||||
class CodeWriter:
|
class CodeWriter:
|
||||||
fd: typing.TextIO
|
fd: typing.TextIO
|
||||||
indent_depth: int
|
indent_depth: int
|
||||||
|
indent_chr = indent
|
||||||
|
|
||||||
|
def split_args(self, args: str) -> typing.List[str]:
|
||||||
|
tokens = args.split(", ")
|
||||||
|
result = [tokens[0]]
|
||||||
|
|
||||||
|
for token in tokens[1:]:
|
||||||
|
if len(", ".join(result[-1]) + token) < 120:
|
||||||
|
result[-1] += f", {token}"
|
||||||
|
else:
|
||||||
|
result.append(token)
|
||||||
|
|
||||||
|
if len(result) > 1 and len(result[-1].split(", ")) < 3:
|
||||||
|
result[-2] += f", {result[-1]}"
|
||||||
|
del result[-1]
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
def __init__(self, file: typing.TextIO, indent_depth: int = 0):
|
def __init__(self, file: typing.TextIO, indent_depth: int = 0):
|
||||||
self.fd = file
|
self.fd = file
|
||||||
@ -99,10 +116,31 @@ class CodeWriter:
|
|||||||
|
|
||||||
def open_constructor_function(self, name: str, args: typing.List[typing.Tuple[str, str]], e: str = None):
|
def open_constructor_function(self, name: str, args: typing.List[typing.Tuple[str, str]], e: str = None):
|
||||||
self.indent_depth += 1
|
self.indent_depth += 1
|
||||||
result = "public " + name + "(" + ", ".join((t + " " + n for t, n in args)) + ")"
|
result = "public " + name + "("
|
||||||
|
|
||||||
|
result_args = ", ".join((t + " " + n for t, n in args))
|
||||||
|
|
||||||
|
if len(result_args) > 60:
|
||||||
|
result_args = result_args.split(", ")
|
||||||
|
|
||||||
|
for i, result_arg in enumerate(result_args):
|
||||||
|
if i:
|
||||||
|
result += (self.indent_depth + 1) * indent
|
||||||
|
|
||||||
|
result += result_arg
|
||||||
|
|
||||||
|
if i != len(result_args) - 1:
|
||||||
|
result += ",\n"
|
||||||
|
else:
|
||||||
|
result += result_args
|
||||||
|
|
||||||
|
result += ")"
|
||||||
|
|
||||||
if e:
|
if e:
|
||||||
result += " throws " + e
|
result += " throws " + e
|
||||||
|
|
||||||
result += " {"
|
result += " {"
|
||||||
|
|
||||||
self.fd.write(result)
|
self.fd.write(result)
|
||||||
|
|
||||||
def declare(self, name: str, typ: str, flags: str, value: str = None):
|
def declare(self, name: str, typ: str, flags: str, value: str = None):
|
||||||
|
32
headers.txt
32
headers.txt
@ -9,25 +9,25 @@ import java.io.DataInput;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
|
||||||
public class TdApi {
|
public class TdApi {
|
||||||
public abstract static class Object {
|
public abstract static class Object {
|
||||||
public native String toString();
|
public native String toString();
|
||||||
|
|
||||||
public abstract int getConstructor();
|
public abstract int getConstructor();
|
||||||
|
|
||||||
public byte[] serialize() throws IOException {
|
public byte[] serialize() throws IOException {
|
||||||
try(ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
|
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
|
||||||
try(DataOutputStream out = new DataOutputStream(baos)) {
|
try (DataOutputStream out = new DataOutputStream(baos)) {
|
||||||
serialize(out);
|
serialize(out);
|
||||||
return baos.toByteArray();
|
return baos.toByteArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void serialize(DataOutput out) throws IOException;
|
public abstract void serialize(DataOutput out) throws IOException;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract static class Function<R extends TdApi.Object> extends TdApi.Object {
|
||||||
|
public native String toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract static class Function<R extends TdApi.Object> extends TdApi.Object {
|
|
||||||
public native String toString();
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user