openrewrite-remote 0.12.0__py3-none-any.whl → 0.13.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- openrewrite_remote-0.13.0.dist-info/METADATA +12 -0
- openrewrite_remote-0.13.0.dist-info/RECORD +14 -0
- {openrewrite_remote-0.12.0.dist-info → openrewrite_remote-0.13.0.dist-info}/WHEEL +2 -1
- openrewrite_remote-0.13.0.dist-info/entry_points.txt +2 -0
- openrewrite_remote-0.13.0.dist-info/top_level.txt +1 -0
- rewrite_remote/__init__.py +12 -0
- rewrite_remote/client.py +70 -0
- {rewrite/remote → rewrite_remote}/event.py +2 -2
- {rewrite/remote → rewrite_remote}/receiver.py +245 -88
- {rewrite/remote → rewrite_remote}/remote_utils.py +78 -40
- {rewrite/remote → rewrite_remote}/remoting.py +116 -44
- {rewrite/remote → rewrite_remote}/sender.py +222 -90
- {rewrite/remote → rewrite_remote}/server.py +100 -36
- rewrite_remote/type_utils.py +109 -0
- openrewrite_remote-0.12.0.dist-info/METADATA +0 -17
- openrewrite_remote-0.12.0.dist-info/RECORD +0 -12
- rewrite/remote/__init__.py +0 -7
- rewrite/remote/client.py +0 -40
- rewrite/remote/type_utils.py +0 -101
@@ -1,100 +1,147 @@
|
|
1
|
+
# type: ignore
|
1
2
|
from __future__ import absolute_import
|
2
3
|
|
3
4
|
import decimal
|
4
5
|
from abc import ABC, abstractmethod
|
5
6
|
from dataclasses import fields
|
6
7
|
from pathlib import Path
|
7
|
-
from typing import
|
8
|
+
from typing import (
|
9
|
+
Any,
|
10
|
+
Callable,
|
11
|
+
ClassVar,
|
12
|
+
Dict,
|
13
|
+
Generic,
|
14
|
+
List,
|
15
|
+
Optional,
|
16
|
+
Protocol,
|
17
|
+
TYPE_CHECKING,
|
18
|
+
Type,
|
19
|
+
TypeVar,
|
20
|
+
)
|
8
21
|
from uuid import UUID
|
9
|
-
|
10
22
|
import cbor2
|
11
23
|
from cbor2 import CBOREncoder
|
12
|
-
|
13
|
-
from rewrite.remote.type_utils import to_java_type_name, to_java_field_name, to_java_type_name_from_value
|
24
|
+
|
14
25
|
from rewrite.visitor import TreeVisitor
|
26
|
+
from rewrite import Tree, Markers, Marker, ParseErrorVisitor, Cursor, Style
|
15
27
|
|
16
|
-
from . import
|
17
|
-
|
18
|
-
|
28
|
+
from rewrite_remote.type_utils import (
|
29
|
+
to_java_type_name,
|
30
|
+
to_java_field_name,
|
31
|
+
to_java_type_name_from_value,
|
32
|
+
)
|
33
|
+
|
34
|
+
from rewrite_remote import remote_utils
|
35
|
+
from rewrite_remote.event import *
|
36
|
+
from rewrite_remote.remote_utils import Operation
|
19
37
|
|
20
38
|
if TYPE_CHECKING:
|
21
39
|
from .remoting import RemotingContext
|
22
40
|
|
23
|
-
A = TypeVar(
|
24
|
-
T = TypeVar(
|
25
|
-
V = TypeVar(
|
26
|
-
I = TypeVar(
|
41
|
+
A = TypeVar("A")
|
42
|
+
T = TypeVar("T", bound=Tree)
|
43
|
+
V = TypeVar("V")
|
44
|
+
I = TypeVar("I")
|
27
45
|
|
28
46
|
|
29
47
|
class Sender(Protocol):
|
30
|
-
def send(self, after: T, before: Optional[T], ctx:
|
31
|
-
...
|
48
|
+
def send(self, after: T, before: Optional[T], ctx: "SenderContext") -> None: ...
|
32
49
|
|
33
50
|
|
34
51
|
class OmniSender(Sender):
|
35
|
-
def send(self, after: Tree, before: Optional[Tree], ctx:
|
52
|
+
def send(self, after: Tree, before: Optional[Tree], ctx: "SenderContext") -> None:
|
36
53
|
sender = ctx.new_sender(type(after))
|
37
54
|
sender.send(after, before, ctx)
|
38
55
|
|
39
56
|
|
40
57
|
class TreeSender(Protocol):
|
41
|
-
def send_node(
|
42
|
-
|
58
|
+
def send_node(
|
59
|
+
self, diff_event: DiffEvent, visitor: Callable[["TreeSender"], None]
|
60
|
+
) -> None: ...
|
43
61
|
|
44
|
-
def send_value(self, diff_event: DiffEvent):
|
45
|
-
...
|
62
|
+
def send_value(self, diff_event: DiffEvent) -> None: ...
|
46
63
|
|
47
|
-
def flush(self):
|
48
|
-
...
|
64
|
+
def flush(self) -> None: ...
|
49
65
|
|
50
66
|
|
51
67
|
class SenderContext(Generic[T]):
|
52
|
-
|
53
|
-
|
54
|
-
|
68
|
+
"""
|
69
|
+
Context for serialization of tree nodes and values.
|
70
|
+
"""
|
71
|
+
|
72
|
+
Registry: Dict[Type[Any], Callable[[], Sender]] = {}
|
73
|
+
|
74
|
+
def __init__(
|
75
|
+
self,
|
76
|
+
sender: "TreeSender",
|
77
|
+
visitor: TreeVisitor = None,
|
78
|
+
before: Optional[Any] = None,
|
79
|
+
):
|
55
80
|
self.sender = sender
|
56
81
|
self.visitor = visitor
|
57
82
|
self.before = before
|
58
83
|
|
59
|
-
def new_sender(self, type_: Type) -> Sender:
|
84
|
+
def new_sender(self, type_: Type[Any]) -> Sender:
|
60
85
|
for entry_type, factory in self.Registry.items():
|
61
86
|
# FIXME find better solution
|
62
87
|
try:
|
63
|
-
if type_.__bases__.__contains__(entry_type) or issubclass(
|
88
|
+
if type_.__bases__.__contains__(entry_type) or issubclass(
|
89
|
+
type_, entry_type
|
90
|
+
):
|
64
91
|
return factory()
|
65
92
|
except:
|
66
93
|
pass
|
67
94
|
raise ValueError(f"Unsupported sender type: {type_}")
|
68
95
|
|
69
|
-
def fork(
|
96
|
+
def fork(
|
97
|
+
self, visitor: TreeVisitor, before: Optional[Any] = None
|
98
|
+
) -> "SenderContext[T]":
|
70
99
|
return SenderContext(self.sender, visitor, before)
|
71
100
|
|
72
|
-
def visit(
|
101
|
+
def visit(
|
102
|
+
self,
|
103
|
+
consumer: Callable[[V, "SenderContext"], None],
|
104
|
+
after: V,
|
105
|
+
before: Optional[V] = None,
|
106
|
+
) -> None:
|
73
107
|
save_before = self.before
|
74
108
|
self.before = before
|
75
109
|
consumer(after, self)
|
76
110
|
self.before = save_before
|
77
111
|
|
78
|
-
def send_tree(self, after: T, ctx:
|
112
|
+
def send_tree(self, after: T, ctx: "SenderContext[T]") -> None:
|
79
113
|
after.accept(self.visitor, ctx)
|
80
114
|
|
81
|
-
def send_any_tree(self, after: T, before: Optional[T]):
|
115
|
+
def send_any_tree(self, after: T, before: Optional[T]) -> None:
|
82
116
|
OmniSender().send(after, before, self)
|
83
117
|
|
84
|
-
def send_node(
|
85
|
-
self
|
86
|
-
|
87
|
-
|
118
|
+
def send_node(
|
119
|
+
self,
|
120
|
+
owner: A,
|
121
|
+
extractor: Callable[[A], Optional[V]],
|
122
|
+
details: Callable[[V, "SenderContext[T]"], None],
|
123
|
+
) -> None:
|
124
|
+
self.send_node_internal(
|
125
|
+
extractor(owner),
|
126
|
+
extractor(self.before) if self.before is not None else None,
|
127
|
+
details,
|
128
|
+
)
|
129
|
+
|
130
|
+
def send_value(
|
131
|
+
self, owner: Any, value_extractor: Callable[[T], Optional[V]]
|
132
|
+
) -> None:
|
88
133
|
after_value = value_extractor(owner)
|
89
134
|
before_value = value_extractor(self.before) if self.before is not None else None
|
90
135
|
self.send_value_internal(after_value, before_value)
|
91
136
|
|
92
|
-
def send_typed_value(self, owner: A, value_extractor: Callable[[A], V]):
|
137
|
+
def send_typed_value(self, owner: A, value_extractor: Callable[[A], V]) -> None:
|
93
138
|
after_value = value_extractor(owner)
|
94
139
|
before_value = value_extractor(self.before) if self.before is not None else None
|
95
140
|
self.send_typed_value_internal(after_value, before_value)
|
96
141
|
|
97
|
-
def send_list_event(
|
142
|
+
def send_list_event(
|
143
|
+
self, after: Optional[List[V]], before: Optional[List[V]]
|
144
|
+
) -> bool:
|
98
145
|
if after == before:
|
99
146
|
evt = DiffEvent(EventType.NoChange, None, None)
|
100
147
|
elif before is None:
|
@@ -105,12 +152,21 @@ class SenderContext(Generic[T]):
|
|
105
152
|
evt = DiffEvent(EventType.Update, None, len(after))
|
106
153
|
|
107
154
|
self.sender.send_value(evt)
|
108
|
-
return
|
109
|
-
|
110
|
-
|
111
|
-
|
155
|
+
return (
|
156
|
+
evt.event_type != EventType.NoChange and evt.event_type != EventType.Delete
|
157
|
+
)
|
158
|
+
|
159
|
+
def send_nodes(
|
160
|
+
self,
|
161
|
+
owner: A,
|
162
|
+
element_extractor: Callable[[A], List[V]],
|
163
|
+
details: Callable[[V, "SenderContext"], None],
|
164
|
+
id_function: Callable[[V], I],
|
165
|
+
) -> None:
|
112
166
|
after_list = element_extractor(owner)
|
113
|
-
before_list =
|
167
|
+
before_list = (
|
168
|
+
element_extractor(self.before) if self.before is not None else None
|
169
|
+
)
|
114
170
|
|
115
171
|
if self.send_list_event(after_list, before_list):
|
116
172
|
if before_list is not None:
|
@@ -122,17 +178,26 @@ class SenderContext(Generic[T]):
|
|
122
178
|
id_function,
|
123
179
|
lambda op, _1, _2, bv, av: {
|
124
180
|
Operation.Delete: lambda: self.send_node_internal(av, bv, details),
|
125
|
-
Operation.NoChange: lambda: self.send_node_internal(
|
181
|
+
Operation.NoChange: lambda: self.send_node_internal(
|
182
|
+
av, bv, details
|
183
|
+
),
|
126
184
|
Operation.Add: lambda: self.send_node_internal(av, bv, details),
|
127
185
|
Operation.Update: lambda: self.send_node_internal(av, bv, details),
|
128
|
-
Operation.Move: lambda: NotImplementedError(
|
129
|
-
|
186
|
+
Operation.Move: lambda: NotImplementedError(
|
187
|
+
"Unexpected operation: " + str(op)
|
188
|
+
),
|
189
|
+
}[op](),
|
130
190
|
)
|
131
191
|
|
132
192
|
if before_list is not None:
|
133
193
|
self.sender.send_value(DiffEvent(EventType.EndList, None, None))
|
134
194
|
|
135
|
-
def send_values(
|
195
|
+
def send_values(
|
196
|
+
self,
|
197
|
+
owner: T,
|
198
|
+
value_extractor: Callable[[T], List[V]],
|
199
|
+
id_function: Callable[[V], I],
|
200
|
+
) -> None:
|
136
201
|
after_list = value_extractor(owner)
|
137
202
|
before_list = value_extractor(self.before) if self.before is not None else None
|
138
203
|
|
@@ -149,14 +214,21 @@ class SenderContext(Generic[T]):
|
|
149
214
|
Operation.NoChange: lambda: self.send_value_internal(av, bv),
|
150
215
|
Operation.Add: lambda: self.send_value_internal(av, bv),
|
151
216
|
Operation.Update: lambda: self.send_value_internal(av, bv),
|
152
|
-
Operation.Move: lambda: NotImplementedError(
|
153
|
-
|
217
|
+
Operation.Move: lambda: NotImplementedError(
|
218
|
+
"Unexpected operation: " + str(op)
|
219
|
+
),
|
220
|
+
}[op](),
|
154
221
|
)
|
155
222
|
|
156
223
|
if before_list is not None:
|
157
224
|
self.sender.send_value(DiffEvent(EventType.EndList, None, None))
|
158
225
|
|
159
|
-
def send_typed_values(
|
226
|
+
def send_typed_values(
|
227
|
+
self,
|
228
|
+
owner: T,
|
229
|
+
value_extractor: Callable[[T], List[V]],
|
230
|
+
id_function: Callable[[V], I],
|
231
|
+
) -> None:
|
160
232
|
after_list = value_extractor(owner)
|
161
233
|
before_list = value_extractor(self.before) if self.before is not None else None
|
162
234
|
|
@@ -173,22 +245,24 @@ class SenderContext(Generic[T]):
|
|
173
245
|
Operation.NoChange: lambda: self.send_typed_value_internal(av, bv),
|
174
246
|
Operation.Add: lambda: self.send_typed_value_internal(av, bv),
|
175
247
|
Operation.Update: lambda: self.send_typed_value_internal(av, bv),
|
176
|
-
Operation.Move: lambda: NotImplementedError(
|
177
|
-
|
248
|
+
Operation.Move: lambda: NotImplementedError(
|
249
|
+
"Unexpected operation: " + str(op)
|
250
|
+
),
|
251
|
+
}[op](),
|
178
252
|
)
|
179
253
|
|
180
254
|
if before_list is not None:
|
181
255
|
self.sender.send_value(DiffEvent(EventType.EndList, None, None))
|
182
256
|
|
183
|
-
def send_markers(self, markers: Markers, ignore):
|
257
|
+
def send_markers(self, markers: Markers, ignore: Optional[bool]) -> None:
|
184
258
|
self.send_value(markers, lambda ms: ms.id)
|
185
259
|
self.send_values(markers, lambda ms: ms.markers, lambda ms: ms.id)
|
186
260
|
|
187
|
-
def send_tree_visitor(self, after: T, ctx:
|
261
|
+
def send_tree_visitor(self, after: T, ctx: "SenderContext") -> None:
|
188
262
|
after.accept(self.visitor, ctx)
|
189
263
|
|
190
264
|
@staticmethod
|
191
|
-
def register(type_: Type, sender_factory: Callable[[], Sender]):
|
265
|
+
def register(type_: Type, sender_factory: Callable[[], Sender]) -> None:
|
192
266
|
SenderContext.Registry[type_] = sender_factory
|
193
267
|
|
194
268
|
@staticmethod
|
@@ -198,12 +272,18 @@ class SenderContext(Generic[T]):
|
|
198
272
|
|
199
273
|
return isinstance(after, (Tree, Markers)) or isinstance(before, (Tree, Markers))
|
200
274
|
|
201
|
-
def send_node_internal(
|
202
|
-
|
275
|
+
def send_node_internal(
|
276
|
+
self,
|
277
|
+
after: Optional[V],
|
278
|
+
before: Optional[V],
|
279
|
+
details: Callable[[V, "SenderContext"], None],
|
280
|
+
) -> None:
|
203
281
|
if self.are_equal(after, before):
|
204
282
|
evt = DiffEvent(EventType.NoChange, None, None)
|
205
283
|
elif before is None:
|
206
|
-
concrete_type =
|
284
|
+
concrete_type = (
|
285
|
+
to_java_type_name(type(after)) if after is not None else None
|
286
|
+
)
|
207
287
|
evt = DiffEvent(EventType.Add, concrete_type, None)
|
208
288
|
elif after is None:
|
209
289
|
evt = DiffEvent(EventType.Delete, None, None)
|
@@ -212,11 +292,13 @@ class SenderContext(Generic[T]):
|
|
212
292
|
|
213
293
|
self.sender.send_node(evt, lambda _: self.visit(details, after, before))
|
214
294
|
|
215
|
-
def send_value_internal(self, after: V, before: Optional[V]):
|
295
|
+
def send_value_internal(self, after: V, before: Optional[V]) -> None:
|
216
296
|
if self.before is not None and self.are_equal(after, before):
|
217
297
|
evt = DiffEvent(EventType.NoChange, None, None)
|
218
298
|
elif self.before is None or before is None:
|
219
|
-
concrete_type =
|
299
|
+
concrete_type = (
|
300
|
+
to_java_type_name(type(after)) if isinstance(after, Marker) else None
|
301
|
+
)
|
220
302
|
evt = DiffEvent(EventType.Add, concrete_type, after)
|
221
303
|
elif after is None:
|
222
304
|
evt = DiffEvent(EventType.Delete, None, None)
|
@@ -225,11 +307,13 @@ class SenderContext(Generic[T]):
|
|
225
307
|
|
226
308
|
self.sender.send_value(evt)
|
227
309
|
|
228
|
-
def send_typed_value_internal(self, after: V, before: Optional[V]):
|
310
|
+
def send_typed_value_internal(self, after: V, before: Optional[V]) -> None:
|
229
311
|
if self.before is not None and self.are_equal(after, before):
|
230
312
|
evt = DiffEvent(EventType.NoChange, None, None)
|
231
313
|
elif self.before is None or before is None:
|
232
|
-
concrete_type =
|
314
|
+
concrete_type = (
|
315
|
+
to_java_type_name_from_value(after) if after is not None else None
|
316
|
+
)
|
233
317
|
evt = DiffEvent(EventType.Add, concrete_type, after)
|
234
318
|
elif after is None:
|
235
319
|
evt = DiffEvent(EventType.Delete, None, None)
|
@@ -240,12 +324,17 @@ class SenderContext(Generic[T]):
|
|
240
324
|
|
241
325
|
|
242
326
|
class SerializationContext:
|
243
|
-
def __init__(
|
244
|
-
|
327
|
+
def __init__(
|
328
|
+
self,
|
329
|
+
remoting_context: "RemotingContext",
|
330
|
+
value_serializers: Optional[Dict[Type[Any], "ValueSerializer"]] = None,
|
331
|
+
):
|
245
332
|
self.remoting_context = remoting_context
|
246
333
|
self.value_serializers = value_serializers or {}
|
247
334
|
|
248
|
-
def serialize(
|
335
|
+
def serialize(
|
336
|
+
self, value: Any, type_name: Optional[str], encoder: CBOREncoder
|
337
|
+
) -> None:
|
249
338
|
if value is None:
|
250
339
|
encoder.encode_none(None)
|
251
340
|
return
|
@@ -266,12 +355,14 @@ class JsonSender(TreeSender):
|
|
266
355
|
self._context = context
|
267
356
|
self._encoder = cbor2.CBOREncoder(self._stream)
|
268
357
|
|
269
|
-
def send_node(self, diff_event, visitor):
|
358
|
+
def send_node(self, diff_event, visitor) -> None:
|
270
359
|
|
271
360
|
if diff_event.event_type in (EventType.Add, EventType.Update):
|
272
361
|
self._encoder.encode(
|
273
|
-
[diff_event.event_type.value]
|
274
|
-
|
362
|
+
[diff_event.event_type.value]
|
363
|
+
if diff_event.concrete_type is None
|
364
|
+
else [diff_event.event_type.value, diff_event.concrete_type]
|
365
|
+
)
|
275
366
|
|
276
367
|
if self.Debug:
|
277
368
|
print(f"SEND: {diff_event}")
|
@@ -287,12 +378,21 @@ class JsonSender(TreeSender):
|
|
287
378
|
|
288
379
|
def send_value(self, diff_event):
|
289
380
|
if diff_event.event_type in (EventType.Add, EventType.Update):
|
290
|
-
self._encoder.encode_length(
|
381
|
+
self._encoder.encode_length(
|
382
|
+
4, 3 if diff_event.concrete_type is not None else 2
|
383
|
+
)
|
291
384
|
self._encoder.encode_int(diff_event.event_type.value)
|
292
385
|
if diff_event.concrete_type is not None:
|
293
386
|
self._encoder.encode(diff_event.concrete_type)
|
294
|
-
self._context.serialize(
|
295
|
-
|
387
|
+
self._context.serialize(
|
388
|
+
diff_event.msg, diff_event.concrete_type, self._encoder
|
389
|
+
)
|
390
|
+
elif diff_event.event_type in (
|
391
|
+
EventType.Delete,
|
392
|
+
EventType.NoChange,
|
393
|
+
EventType.StartList,
|
394
|
+
EventType.EndList,
|
395
|
+
):
|
296
396
|
self._encoder.encode([diff_event.event_type.value])
|
297
397
|
else:
|
298
398
|
raise NotImplementedError()
|
@@ -304,23 +404,34 @@ class JsonSender(TreeSender):
|
|
304
404
|
self._stream.flush()
|
305
405
|
|
306
406
|
|
307
|
-
INDEFINITE_ARRAY_START = b
|
308
|
-
INDEFINITE_MAP_START = b
|
309
|
-
BREAK_MARKER = b
|
407
|
+
INDEFINITE_ARRAY_START = b"\x9f"
|
408
|
+
INDEFINITE_MAP_START = b"\xbf"
|
409
|
+
BREAK_MARKER = b"\xff"
|
310
410
|
|
311
411
|
|
312
412
|
class ValueSerializer(ABC):
|
313
413
|
|
314
414
|
@abstractmethod
|
315
|
-
def serialize(
|
415
|
+
def serialize(
|
416
|
+
self,
|
417
|
+
value: Any,
|
418
|
+
type_name: Optional[str],
|
419
|
+
writer: CBOREncoder,
|
420
|
+
context: SerializationContext,
|
421
|
+
) -> None:
|
316
422
|
pass
|
317
423
|
|
318
424
|
@staticmethod
|
319
|
-
def write_object_using_reflection(
|
320
|
-
|
321
|
-
|
425
|
+
def write_object_using_reflection(
|
426
|
+
value: Any,
|
427
|
+
type_name: Optional[str],
|
428
|
+
with_id: bool,
|
429
|
+
encoder: CBOREncoder,
|
430
|
+
context: SerializationContext,
|
431
|
+
) -> None:
|
432
|
+
if type(value).__qualname__ == "JavaType.Primitive":
|
322
433
|
# FIXME implement type attribution support
|
323
|
-
encoder.encode([
|
434
|
+
encoder.encode(["org.openrewrite.java.tree.JavaType$Primitive", 0])
|
324
435
|
return
|
325
436
|
if with_id and (id := context.remoting_context.try_get_id(value)):
|
326
437
|
encoder.encode_int(id)
|
@@ -335,14 +446,23 @@ class ValueSerializer(ABC):
|
|
335
446
|
encoder.encode_int(id)
|
336
447
|
|
337
448
|
for field in fields(value):
|
338
|
-
if field.name[0] ==
|
449
|
+
if field.name[0] == "_" and (
|
450
|
+
not hasattr(field.type, "__origin__")
|
451
|
+
or field.type.__origin__ is not ClassVar
|
452
|
+
):
|
339
453
|
encoder.encode_string(to_java_field_name(field))
|
340
454
|
context.serialize(getattr(value, field.name), None, encoder)
|
341
455
|
encoder.write(BREAK_MARKER)
|
342
456
|
|
343
457
|
|
344
458
|
class DefaultValueSerializer(ValueSerializer):
|
345
|
-
def serialize(
|
459
|
+
def serialize(
|
460
|
+
self,
|
461
|
+
value: Any,
|
462
|
+
type_name: Optional[str],
|
463
|
+
encoder: CBOREncoder,
|
464
|
+
context: SerializationContext,
|
465
|
+
) -> None:
|
346
466
|
if isinstance(value, (int, float, str, bool, decimal.Decimal)):
|
347
467
|
encoder.encode(value)
|
348
468
|
elif value is None:
|
@@ -358,32 +478,34 @@ class DefaultValueSerializer(ValueSerializer):
|
|
358
478
|
for item in value:
|
359
479
|
context.serialize(item, None, encoder)
|
360
480
|
elif isinstance(value, Markers):
|
361
|
-
if
|
481
|
+
if id := context.remoting_context.try_get_id(value):
|
362
482
|
encoder.encode_int(id)
|
363
483
|
else:
|
364
484
|
id = context.remoting_context.add(value)
|
365
485
|
encoder.encode_length(5, 3)
|
366
|
-
encoder.encode_string(
|
486
|
+
encoder.encode_string("@ref")
|
367
487
|
encoder.encode_int(id)
|
368
|
-
encoder.encode_string(
|
488
|
+
encoder.encode_string("id")
|
369
489
|
encoder.encode_uuid(value.id)
|
370
|
-
encoder.encode_string(
|
490
|
+
encoder.encode_string("markers")
|
371
491
|
encoder.encode_length(4, len(value.markers))
|
372
492
|
for marker in value.markers:
|
373
493
|
context.serialize(marker, None, encoder)
|
374
494
|
elif isinstance(value, (Marker, Style)):
|
375
|
-
if
|
495
|
+
if id := context.remoting_context.try_get_id(value):
|
376
496
|
encoder.encode_int(id)
|
377
497
|
else:
|
378
498
|
id = context.remoting_context.add(value)
|
379
499
|
encoder.write(INDEFINITE_MAP_START)
|
380
500
|
encoder.encode_string("@c")
|
381
501
|
encoder.encode_string(to_java_type_name(type(value)))
|
382
|
-
encoder.encode_string(
|
502
|
+
encoder.encode_string("@ref")
|
383
503
|
encoder.encode_int(id)
|
384
504
|
for field in fields(value):
|
385
|
-
if field.name[0] ==
|
386
|
-
|
505
|
+
if field.name[0] == "_" and (
|
506
|
+
not hasattr(field.type, "__origin__")
|
507
|
+
or field.type.__origin__ is not ClassVar
|
508
|
+
):
|
387
509
|
encoder.encode_string(to_java_field_name(field))
|
388
510
|
context.serialize(getattr(value, field.name), None, encoder)
|
389
511
|
encoder.write(BREAK_MARKER)
|
@@ -393,19 +515,29 @@ class DefaultValueSerializer(ValueSerializer):
|
|
393
515
|
elif isinstance(value, complex):
|
394
516
|
encoder.encode(str(value))
|
395
517
|
else:
|
396
|
-
ValueSerializer.write_object_using_reflection(
|
518
|
+
ValueSerializer.write_object_using_reflection(
|
519
|
+
value, type_name, False, encoder, context
|
520
|
+
)
|
397
521
|
|
398
522
|
|
399
|
-
def delegate_based_serializer(
|
523
|
+
def delegate_based_serializer(
|
524
|
+
delegate: Callable[[Any, Optional[str], CBOREncoder, SerializationContext], None]
|
525
|
+
) -> Type[ValueSerializer]:
|
400
526
|
class DelegateBasedSerializer(ValueSerializer):
|
401
|
-
def serialize(
|
527
|
+
def serialize(
|
528
|
+
self,
|
529
|
+
value: Any,
|
530
|
+
type_name: Optional[str],
|
531
|
+
encoder: CBOREncoder,
|
532
|
+
context: SerializationContext,
|
533
|
+
) -> None:
|
402
534
|
delegate(value, type_name, encoder, context)
|
403
535
|
|
404
536
|
return DelegateBasedSerializer
|
405
537
|
|
406
538
|
|
407
539
|
class ParseErrorSender(Sender):
|
408
|
-
def send(self, after, before, ctx):
|
540
|
+
def send(self, after: Tree, before: Optional[Tree], ctx: "SenderContext") -> None:
|
409
541
|
visitor = self.Visitor()
|
410
542
|
visitor.visit(after, ctx.fork(visitor, before))
|
411
543
|
|