mirror of https://github.com/sveltejs/svelte
parent
bcf0d2fa3c
commit
7bf907e5c8
@ -1,69 +1,83 @@
|
||||
import EachBlock from '../EachBlock';
|
||||
import ThenBlock from '../ThenBlock';
|
||||
import CatchBlock from '../CatchBlock';
|
||||
import InlineComponent from '../InlineComponent';
|
||||
import Element from '../Element';
|
||||
import SlotTemplate from '../SlotTemplate';
|
||||
import ConstTag from '../ConstTag';
|
||||
export default class TemplateScope {
|
||||
|
||||
type NodeWithScope =
|
||||
| EachBlock
|
||||
| ThenBlock
|
||||
| CatchBlock
|
||||
| InlineComponent
|
||||
| Element
|
||||
| SlotTemplate
|
||||
| ConstTag;
|
||||
/** @type {Set<string>} */
|
||||
names;
|
||||
|
||||
export default class TemplateScope {
|
||||
names: Set<string>;
|
||||
dependencies_for_name: Map<string, Set<string>>;
|
||||
owners: Map<string, NodeWithScope> = new Map();
|
||||
parent?: TemplateScope;
|
||||
/** @type {Map<string, Set<string>>} */
|
||||
dependencies_for_name;
|
||||
|
||||
/** @type {Map<string, NodeWithScope>} */
|
||||
owners = new Map();
|
||||
|
||||
constructor(parent?: TemplateScope) {
|
||||
this.parent = parent;
|
||||
this.names = new Set(parent ? parent.names : []);
|
||||
this.dependencies_for_name = new Map(parent ? parent.dependencies_for_name : []);
|
||||
}
|
||||
/** @type {TemplateScope} */
|
||||
parent;
|
||||
|
||||
add(name, dependencies: Set<string>, owner) {
|
||||
this.names.add(name);
|
||||
this.dependencies_for_name.set(name, dependencies);
|
||||
this.owners.set(name, owner);
|
||||
return this;
|
||||
}
|
||||
/** @param {TemplateScope} [parent] undefined */
|
||||
constructor(parent) {
|
||||
this.parent = parent;
|
||||
this.names = new Set(parent ? parent.names : []);
|
||||
this.dependencies_for_name = new Map(parent ? parent.dependencies_for_name : []);
|
||||
}
|
||||
|
||||
child() {
|
||||
const child = new TemplateScope(this);
|
||||
return child;
|
||||
}
|
||||
/**
|
||||
* @param {any} name
|
||||
* @param {Set<string>} dependencies
|
||||
* @param {any} owner
|
||||
*/
|
||||
add(name, dependencies, owner) {
|
||||
this.names.add(name);
|
||||
this.dependencies_for_name.set(name, dependencies);
|
||||
this.owners.set(name, owner);
|
||||
return this;
|
||||
}
|
||||
child() {
|
||||
const child = new TemplateScope(this);
|
||||
return child;
|
||||
}
|
||||
|
||||
is_top_level(name: string) {
|
||||
return !this.parent || (!this.names.has(name) && this.parent.is_top_level(name));
|
||||
}
|
||||
/** @param {string} name */
|
||||
is_top_level(name) {
|
||||
return !this.parent || (!this.names.has(name) && this.parent.is_top_level(name));
|
||||
}
|
||||
|
||||
get_owner(name: string): NodeWithScope {
|
||||
return this.owners.get(name) || (this.parent && this.parent.get_owner(name));
|
||||
}
|
||||
/**
|
||||
* @param {string} name
|
||||
* @returns {any}
|
||||
*/
|
||||
get_owner(name) {
|
||||
return this.owners.get(name) || (this.parent && this.parent.get_owner(name));
|
||||
}
|
||||
|
||||
is_let(name: string) {
|
||||
const owner = this.get_owner(name);
|
||||
return (
|
||||
owner &&
|
||||
(owner.type === 'Element' ||
|
||||
owner.type === 'InlineComponent' ||
|
||||
owner.type === 'SlotTemplate')
|
||||
);
|
||||
}
|
||||
/** @param {string} name */
|
||||
is_let(name) {
|
||||
const owner = this.get_owner(name);
|
||||
return (owner &&
|
||||
(owner.type === 'Element' ||
|
||||
owner.type === 'InlineComponent' ||
|
||||
owner.type === 'SlotTemplate'));
|
||||
}
|
||||
|
||||
is_await(name: string) {
|
||||
const owner = this.get_owner(name);
|
||||
return owner && (owner.type === 'ThenBlock' || owner.type === 'CatchBlock');
|
||||
}
|
||||
/** @param {string} name */
|
||||
is_await(name) {
|
||||
const owner = this.get_owner(name);
|
||||
return owner && (owner.type === 'ThenBlock' || owner.type === 'CatchBlock');
|
||||
}
|
||||
|
||||
is_const(name: string) {
|
||||
const owner = this.get_owner(name);
|
||||
return owner && owner.type === 'ConstTag';
|
||||
}
|
||||
/** @param {string} name */
|
||||
is_const(name) {
|
||||
const owner = this.get_owner(name);
|
||||
return owner && owner.type === 'ConstTag';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {| EachBlock
|
||||
* | ThenBlock
|
||||
* | CatchBlock
|
||||
* | InlineComponent
|
||||
* | Element
|
||||
* | SlotTemplate
|
||||
* | ConstTag} NodeWithScope
|
||||
*/
|
||||
|
||||
|
||||
Loading…
Reference in new issue