93 lines
2.7 KiB
JavaScript
93 lines
2.7 KiB
JavaScript
![]() |
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.default = exports.ClassScope = void 0;
|
||
|
var _scopeflags = require("./scopeflags");
|
||
|
var _parseError = require("../parse-error");
|
||
|
class ClassScope {
|
||
|
constructor() {
|
||
|
this.privateNames = new Set();
|
||
|
this.loneAccessors = new Map();
|
||
|
this.undefinedPrivateNames = new Map();
|
||
|
}
|
||
|
}
|
||
|
exports.ClassScope = ClassScope;
|
||
|
class ClassScopeHandler {
|
||
|
constructor(parser) {
|
||
|
this.parser = void 0;
|
||
|
this.stack = [];
|
||
|
this.undefinedPrivateNames = new Map();
|
||
|
this.parser = parser;
|
||
|
}
|
||
|
current() {
|
||
|
return this.stack[this.stack.length - 1];
|
||
|
}
|
||
|
enter() {
|
||
|
this.stack.push(new ClassScope());
|
||
|
}
|
||
|
exit() {
|
||
|
const oldClassScope = this.stack.pop();
|
||
|
const current = this.current();
|
||
|
for (const [name, loc] of Array.from(oldClassScope.undefinedPrivateNames)) {
|
||
|
if (current) {
|
||
|
if (!current.undefinedPrivateNames.has(name)) {
|
||
|
current.undefinedPrivateNames.set(name, loc);
|
||
|
}
|
||
|
} else {
|
||
|
this.parser.raise(_parseError.Errors.InvalidPrivateFieldResolution, {
|
||
|
at: loc,
|
||
|
identifierName: name
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
declarePrivateName(name, elementType, loc) {
|
||
|
const {
|
||
|
privateNames,
|
||
|
loneAccessors,
|
||
|
undefinedPrivateNames
|
||
|
} = this.current();
|
||
|
let redefined = privateNames.has(name);
|
||
|
if (elementType & _scopeflags.CLASS_ELEMENT_KIND_ACCESSOR) {
|
||
|
const accessor = redefined && loneAccessors.get(name);
|
||
|
if (accessor) {
|
||
|
const oldStatic = accessor & _scopeflags.CLASS_ELEMENT_FLAG_STATIC;
|
||
|
const newStatic = elementType & _scopeflags.CLASS_ELEMENT_FLAG_STATIC;
|
||
|
const oldKind = accessor & _scopeflags.CLASS_ELEMENT_KIND_ACCESSOR;
|
||
|
const newKind = elementType & _scopeflags.CLASS_ELEMENT_KIND_ACCESSOR;
|
||
|
redefined = oldKind === newKind || oldStatic !== newStatic;
|
||
|
if (!redefined) loneAccessors.delete(name);
|
||
|
} else if (!redefined) {
|
||
|
loneAccessors.set(name, elementType);
|
||
|
}
|
||
|
}
|
||
|
if (redefined) {
|
||
|
this.parser.raise(_parseError.Errors.PrivateNameRedeclaration, {
|
||
|
at: loc,
|
||
|
identifierName: name
|
||
|
});
|
||
|
}
|
||
|
privateNames.add(name);
|
||
|
undefinedPrivateNames.delete(name);
|
||
|
}
|
||
|
usePrivateName(name, loc) {
|
||
|
let classScope;
|
||
|
for (classScope of this.stack) {
|
||
|
if (classScope.privateNames.has(name)) return;
|
||
|
}
|
||
|
if (classScope) {
|
||
|
classScope.undefinedPrivateNames.set(name, loc);
|
||
|
} else {
|
||
|
this.parser.raise(_parseError.Errors.InvalidPrivateFieldResolution, {
|
||
|
at: loc,
|
||
|
identifierName: name
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
exports.default = ClassScopeHandler;
|
||
|
|
||
|
//# sourceMappingURL=class-scope.js.map
|