Support class referencing from inside
parent
e8fdcccdea
commit
a49624fb6e
|
@ -27,11 +27,11 @@ class Collector {
|
||||||
|
|
||||||
const scope = global.extend(namespace);
|
const scope = global.extend(namespace);
|
||||||
|
|
||||||
this._visit(ast.program, scope);
|
this._spawn(ast.program, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Given the AST output of babylon parse, walk through in a depth-first order.
|
// Given the AST output of babylon parse, walk through in a depth-first order.
|
||||||
_visit(root, scope) {
|
_spawn(root, scope) {
|
||||||
let stack;
|
let stack;
|
||||||
let parent;
|
let parent;
|
||||||
let keys = [];
|
let keys = [];
|
||||||
|
@ -74,7 +74,7 @@ class Collector {
|
||||||
const extractor = extractors[node.type];
|
const extractor = extractors[node.type];
|
||||||
|
|
||||||
if (!extractor) {
|
if (!extractor) {
|
||||||
this._visit(node, scope);
|
this._spawn(node, scope);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,6 +93,10 @@ class Collector {
|
||||||
result = null;
|
result = null;
|
||||||
} else if (value instanceof Command) {
|
} else if (value instanceof Command) {
|
||||||
switch (value.name) {
|
switch (value.name) {
|
||||||
|
case 'spawn':
|
||||||
|
this._spawn(value.data, scope);
|
||||||
|
|
||||||
|
break;
|
||||||
case 'provide':
|
case 'provide':
|
||||||
const schema = value.data;
|
const schema = value.data;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
class Command {
|
class Command {
|
||||||
|
static spawn(node) {
|
||||||
|
return new Command('spawn', node);
|
||||||
|
}
|
||||||
|
|
||||||
static provide(schema) {
|
static provide(schema) {
|
||||||
return new Command('provide', schema);
|
return new Command('provide', schema);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
|
|
||||||
const {provide, query, enter, exit, namespace} = require('./commands');
|
const {spawn, provide, query, enter, exit, namespace} = require('./commands');
|
||||||
const {partition} = require('./utils');
|
const {partition} = require('./utils');
|
||||||
|
|
||||||
const extractors = {
|
const extractors = {
|
||||||
|
@ -56,7 +56,7 @@ const extractors = {
|
||||||
},
|
},
|
||||||
|
|
||||||
* ClassMethod(node) {
|
* ClassMethod(node) {
|
||||||
yield node.body;
|
yield spawn(node.body);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
class Test {
|
||||||
|
foo() {
|
||||||
|
type X = {
|
||||||
|
t: Test,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ###
|
||||||
|
[
|
||||||
|
{
|
||||||
|
type: 'record',
|
||||||
|
name: 'Test',
|
||||||
|
namespace: 'typeInMethod',
|
||||||
|
fields: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'record',
|
||||||
|
name: 'X',
|
||||||
|
namespace: 'typeInMethod._0',
|
||||||
|
fields: [{name: 't', type: 'typeInMethod.Test'}],
|
||||||
|
},
|
||||||
|
]
|
Loading…
Reference in New Issue