Skip to content

Commit e733053

Browse files
committed
ParserNode instances usable without ECore
1 parent 6dbf811 commit e733053

File tree

6 files changed

+42
-45
lines changed

6 files changed

+42
-45
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
All notable changes to this project from version 1.2.0 upwards are documented in this file.
33
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
44

5+
## [1.6.11] – 2024-03-07
6+
7+
### Changed
8+
- ParserNode instances usable without ECore
9+
510
## [1.6.10] – 2024-03-07
611

712
### Changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"description": "AST building blocks for TypeScript/JavaScript, part of the *lasu family, with optional integrations with ANTLR4 and Ecore.",
44
"author": "Strumenta s.r.l.",
55
"publisher": "strumenta",
6-
"version": "1.6.10",
6+
"version": "1.6.11",
77
"license": "Apache-2.0",
88
"keywords": [
99
"antlr",

src/interop/strumenta-playground.ts

+11-39
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,7 @@ import {Node} from "../model/model";
44
import ECore from "ecore/dist/ecore";
55
import {Position} from "../model/position";
66
import {PARSER_EPACKAGE, PARSER_TRACE_ECLASS} from "./parser-package";
7-
import {
8-
THE_AST_EPACKAGE,
9-
THE_NODE_ORIGIN_ECLASS,
10-
THE_RESULT_ECLASS as THE_RESULT_ECLASS_V2
11-
} from "./starlasu-v2-metamodel";
12-
import {THE_RESULT_ECLASS as THE_RESULT_ECLASS_V1} from "./kolasu-v1-metamodel";
7+
import {THE_AST_EPACKAGE, THE_NODE_ORIGIN_ECLASS,} from "./starlasu-v2-metamodel";
138
import {Issue} from "../validation";
149
import {
1510
THE_TRANSPILATION_TRACE_ECLASS,
@@ -19,7 +14,7 @@ import {
1914
} from "./transpilation-package";
2015
import {TRANSPILATION_EPACKAGE_V1} from "./transpilation-package-v1";
2116
import {ensureEcoreContainsAllDataTypes} from "./ecore-patching";
22-
import {NodeAdapter, TraceNode} from "../trace/trace-node";
17+
import {NodeAdapter, ParserNode, TraceNode} from "../trace/trace-node";
2318

2419
export function saveForStrumentaPlayground<R extends Node>(
2520
result: ParsingResult<R>, name: string,
@@ -51,52 +46,29 @@ export function saveForStrumentaPlayground<R extends Node>(
5146
}
5247

5348
export class ParserTrace {
54-
constructor(private eo: ECore.EObject) {
55-
if (!eo.eClass == PARSER_TRACE_ECLASS) {
56-
throw new Error("Not a parser trace: " + eo.eClass);
49+
constructor(private node: NodeAdapter) {
50+
if (node.nodeDefinition?.package != "StrumentaLanguageSupportParsing" || node.nodeDefinition?.name != "ParserTrace") {
51+
throw new Error("Not a parser trace: " + node.nodeDefinition?.package + "." + node.nodeDefinition?.name);
5752
}
5853
}
5954

6055
get rootNode(): ParserNode {
6156
let root;
62-
const ast = this.eo.get("ast");
63-
if (ast.eClass == THE_RESULT_ECLASS_V2 || ast.eClass == THE_RESULT_ECLASS_V1) {
57+
const ast = this.node.get("ast");
58+
if (ast?.nodeDefinition?.name == "Result") {
6459
root = ast.get("root");
6560
} else {
6661
root = ast;
6762
}
68-
return new ParserNode(new ECoreNode(root), undefined, this);
63+
return new ParserNode(root);
6964
}
7065

7166
get issues(): Issue[] {
72-
const ast = this.eo.get("ast");
73-
if (ast.eClass == THE_RESULT_ECLASS_V2 || ast.eClass == THE_RESULT_ECLASS_V1) {
74-
return fromEObject(ast.get("issues")) as Issue[] || [];
75-
} else {
76-
return [];
77-
}
67+
return this.node.get("ast")?.getIssues() || [];
7868
}
7969

8070
get name(): string | undefined {
81-
return this.eo.get("name");
82-
}
83-
}
84-
85-
export class ParserNode extends TraceNode {
86-
87-
parent?: ParserNode;
88-
89-
constructor(inner: NodeAdapter, parent: ParserNode | undefined, protected trace: ParserTrace) {
90-
super(inner);
91-
this.parent = parent;
92-
}
93-
94-
getChildren(role?: string): ParserNode[] {
95-
return this.nodeAdapter.getChildren(role).map((c) => new ParserNode(c, this, this.trace));
96-
}
97-
98-
get children(): Node[] {
99-
return this.getChildren();
71+
return this.node.getAttribute("name");
10072
}
10173
}
10274

@@ -154,7 +126,7 @@ export class ParserTraceLoader {
154126
const resource = this.resourceSet.create({uri: uri});
155127
return withLanguageMetamodel(
156128
this.languages, language, this.resourceSet, resource,
157-
() => new ParserTrace(loadEObject(trace, resource, PARSER_TRACE_ECLASS)));
129+
() => new ParserTrace(new ECoreNode(loadEObject(trace, resource, PARSER_TRACE_ECLASS))));
158130
}
159131
}
160132

src/trace/trace-node.ts

+20
Original file line numberDiff line numberDiff line change
@@ -200,3 +200,23 @@ export abstract class TraceNode extends Node {
200200
return this.nodeAdapter.isStatement();
201201
}
202202
}
203+
204+
export class ParserNode extends TraceNode {
205+
206+
parent?: ParserNode;
207+
208+
constructor(inner: NodeAdapter) {
209+
super(inner);
210+
if (inner.parent) {
211+
this.parent = new ParserNode(inner.parent);
212+
}
213+
}
214+
215+
getChildren(role?: string): ParserNode[] {
216+
return this.nodeAdapter.getChildren(role).map((c) => new ParserNode(c));
217+
}
218+
219+
get children(): ParserNode[] {
220+
return this.getChildren();
221+
}
222+
}

tests/interop/lionweb.test.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import FS_LANGUAGE_JSON from "./fs-language.json";
22
import FS_MODEL from "./fs-model.json";
33
import {expect} from "chai";
44
import {deserializeChunk, deserializeLanguages, SerializationChunk} from "@lionweb/core";
5-
import {Children, Node, Property, walk} from "../../src";
5+
import {Children, Node, ParserNode, Property, walk} from "../../src";
66
import {
77
findClassifier,
88
LanguageMapping, LionwebNode,
@@ -11,7 +11,7 @@ import {
1111
} from "../../src/interop/lionweb";
1212
import {map, pipe, reduce} from "iter-ops";
1313
import {STARLASU_LANGUAGE} from "../../src/interop/lionweb-starlasu-language";
14-
import {ParserNode, ParserTrace} from "../../src/interop/strumenta-playground";
14+
import {ParserTrace} from "../../src/interop/strumenta-playground";
1515
import {PARSER_TRACE_ECLASS} from "../../src/interop/parser-package";
1616

1717
abstract class File extends Node {
@@ -104,7 +104,7 @@ describe('Lionweb integration', function() {
104104
expect(nodes.length).to.equal(1);
105105
const root = nodes[0];
106106
expect(root.node).to.be.instanceof(LionwebNode);
107-
let dir = new ParserNode(root.node as LionwebNode, undefined, new ParserTrace(PARSER_TRACE_ECLASS.create({}))); // TODO
107+
let dir = new ParserNode(root.node as LionwebNode);
108108
expect(dir.getRole()).to.be.undefined;
109109
expect(dir.nodeDefinition.name).to.equal("Directory");
110110
expect(dir.getAttribute("name")).to.equal("resources.zip");

tests/interop/parser-trace.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {expect} from "chai";
22
import * as fs from "fs";
3-
import {findByPosition, IssueSeverity, IssueType, Point, pos, Position} from "../../src";
4-
import {ParserNode, ParserTraceLoader} from "../../src/interop/strumenta-playground";
3+
import {findByPosition, IssueSeverity, IssueType, ParserNode, Point, pos, Position} from "../../src";
4+
import {ParserTraceLoader} from "../../src/interop/strumenta-playground";
55
import {TraceNode} from "../../src/trace/trace-node";
66

77
describe('Parser traces – Kolasu metamodel V1', function() {

0 commit comments

Comments
 (0)