|
1 |
| -from pyecore.ecore import EAttribute, EObject, EPackage, EReference, EString, MetaEClass |
| 1 | +from io import IOBase, BytesIO |
| 2 | + |
| 3 | +from pyecore.ecore import EAttribute, EObject, EReference, EString, MetaEClass |
| 4 | +from pyecore.resources import ResourceSet, URI |
| 5 | +from pyecore.resources.json import JsonResource as BaseJsonResource |
2 | 6 |
|
3 | 7 | from pylasu.StrumentaLanguageSupport import Result, Issue
|
4 | 8 |
|
5 |
| -TRANSPILATION_METAMODEL = EPackage( |
6 |
| - name="StrumentaLanguageSupportTranspilation", nsURI="https://strumenta.com/kolasu/transpilation/v1") |
| 9 | +nsURI = "https://strumenta.com/kolasu/transpilation/v1" |
| 10 | +name = "StrumentaLanguageSupportTranspilation" |
| 11 | + |
| 12 | + |
| 13 | +class JsonResource(BaseJsonResource): |
| 14 | + |
| 15 | + def open_out_stream(self, other=None): |
| 16 | + if isinstance(other, IOBase): |
| 17 | + return other |
| 18 | + else: |
| 19 | + return super().open_out_stream(other) |
7 | 20 |
|
8 | 21 |
|
9 | 22 | class TranspilationTrace(EObject, metaclass=MetaEClass):
|
10 |
| - original_code = EAttribute(name="originalCode", eType=EString) |
11 |
| - source_result = EReference(name="sourceResult", containment=True, eType=Result) |
12 |
| - target_result = EReference(name="targetResult", containment=True, eType=Result) |
13 |
| - generated_code = EAttribute(name="generatedCode", eType=EString) |
| 23 | + # Note: we use camelCase here because Pyecore's JSON serialization doesn't handle having different names for |
| 24 | + # Python attributes and their corresponding Ecore structural features. |
| 25 | + originalCode = EAttribute(eType=EString) |
| 26 | + sourceResult = EReference(containment=True, eType=Result) |
| 27 | + targetResult = EReference(containment=True, eType=Result) |
| 28 | + generatedCode = EAttribute(eType=EString) |
14 | 29 | issues = EReference(containment=True, eType=Issue, upper=-1)
|
15 | 30 |
|
16 | 31 | def __init__(self, *, original_code=None, source_result=None, target_result=None, generated_code=None, issues=None):
|
17 | 32 | super().__init__()
|
18 | 33 | if original_code is not None:
|
19 |
| - self.original_code = original_code |
| 34 | + self.originalCode = original_code |
20 | 35 | if source_result is not None:
|
21 |
| - self.source_result = source_result |
| 36 | + self.sourceResult = source_result |
22 | 37 | if target_result is not None:
|
23 |
| - self.target_result = target_result |
| 38 | + self.targetResult = target_result |
24 | 39 | if generated_code is not None:
|
25 |
| - self.generated_code = generated_code |
| 40 | + self.generatedCode = generated_code |
26 | 41 | if issues:
|
27 | 42 | self.issues.extend(issues)
|
28 | 43 |
|
29 |
| - |
30 |
| -TRANSPILATION_METAMODEL.eContents.append(TranspilationTrace) |
| 44 | + def save_as_json(self, name, *packages): |
| 45 | + rset = ResourceSet() |
| 46 | + rset.resource_factory['json'] = JsonResource |
| 47 | + resource = rset.create_resource(URI(name)) |
| 48 | + for pkg in packages: |
| 49 | + package_resource = rset.create_resource(URI(pkg.nsURI)) |
| 50 | + package_resource.contents.add(pkg) |
| 51 | + resource.contents.append(self) |
| 52 | + with BytesIO() as out: |
| 53 | + resource.save(out) |
| 54 | + return out.getvalue().decode('utf-8') |
0 commit comments