Support interface inheritance
parent
ba36bc227e
commit
0bb628e2e4
|
@ -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;
|
||||
},
|
||||
|
|
|
@ -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'},
|
||||
],
|
||||
},
|
||||
]
|
|
@ -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'},
|
||||
],
|
||||
},
|
||||
]
|
Loading…
Reference in New Issue