Support interface inheritance

master
Paul Loyd 2017-11-03 11:00:34 +03:00
parent ba36bc227e
commit 0bb628e2e4
3 changed files with 98 additions and 41 deletions

View File

@ -20,7 +20,23 @@ const extractors = {
},
* InterfaceDeclaration(node) {
const schema = yield node.body;
let schema = yield node.body;
if (node.extends.length > 0) {
const schemas = [];
for (const extend of node.extends) {
const name = yield extend;
const schema = yield query(name);
schemas.push(schema);
}
schemas.push(schema);
schema = mergeSchemas(schemas);
}
schema.name = yield node.id;
schema.namespace = yield namespace();
@ -199,6 +215,10 @@ const extractors = {
yield exit();
},
* InterfaceExtends(node) {
return yield node.id;
},
* Identifier(node) {
return node.name;
},

View File

@ -1,40 +0,0 @@
class A {
a: number;
}
class B extends A {
b: string;
}
class C extends B {
c: boolean;
}
// ###
[
{
type: 'record',
name: 'A',
namespace: 'inherit',
fields: [{name: 'a', type: 'double'}],
},
{
type: 'record',
name: 'B',
namespace: 'inherit',
fields: [
{name: 'a', type: 'double'},
{name: 'b', type: 'string'},
],
},
{
type: 'record',
name: 'C',
namespace: 'inherit',
fields: [
{name: 'a', type: 'double'},
{name: 'b', type: 'string'},
{name: 'c', type: 'boolean'},
],
},
]

77
tests/inheritance.js Normal file
View File

@ -0,0 +1,77 @@
class A {
a: number;
}
class B extends A {
b: string;
}
class C extends B {
c: boolean;
}
interface X {
x: number;
}
interface Y extends X {
y: string;
}
interface Z extends Y {
z: boolean;
}
// ###
[
{
type: 'record',
name: 'A',
namespace: 'inheritance',
fields: [{name: 'a', type: 'double'}],
},
{
type: 'record',
name: 'B',
namespace: 'inheritance',
fields: [
{name: 'a', type: 'double'},
{name: 'b', type: 'string'},
],
},
{
type: 'record',
name: 'C',
namespace: 'inheritance',
fields: [
{name: 'a', type: 'double'},
{name: 'b', type: 'string'},
{name: 'c', type: 'boolean'},
],
},
{
type: 'record',
name: 'X',
namespace: 'inheritance',
fields: [{name: 'x', type: 'double'}],
},
{
type: 'record',
name: 'Y',
namespace: 'inheritance',
fields: [
{name: 'x', type: 'double'},
{name: 'y', type: 'string'},
],
},
{
type: 'record',
name: 'Z',
namespace: 'inheritance',
fields: [
{name: 'x', type: 'double'},
{name: 'y', type: 'string'},
{name: 'z', type: 'boolean'},
],
},
]