af689cc5d5
* es private fields in in (#52) add support for the 'private-fields-in-in' TC39 proposal Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [fixup] include inToken when walking forEachChild(node, cb) * [squash] re-accept lib definition baseline changes * [squash] reduce if/else to ternary Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] drop 'originalName' and rename parameter instead Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] extend spelling suggestion to all privateIdentifiers Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] revert the added lexical spelling suggestions logic Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] update baseline Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] inline variable as per PR suggestion Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] test targets both esnext and es2020 as per PR comment Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * switch to using a binary expression Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] PrivateIdentifier now extends PrimaryExpression Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] accept public api baseline changes Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] classPrivateFieldInHelper now has documentation Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] type-check now follows existing in-expression path Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] parser now follows existing binaryExpression path Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] correct typo in comment Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] no longer use esNext flag Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] swap 'reciever, state' helper params Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] remove change to parenthesizerRules Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] apply suggested changes to checker Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] remove need for assertion in fixSpelling Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] improve comment hint in test Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] fix comment typos Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] add flow-test for Foo | FooSub | Bar Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] add checkExternalEmitHelpers call and new test case Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] simplify and correct parser Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] move most of the added checker logic to expression level Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] always error when privateId could not be resolved Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] reword comment Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] fix codeFixSpelling test Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] do less work Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * store symbol by priateId not binaryExpression Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * moved parsePrivateIdentifier into parsePrimaryExpression Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] checkInExpressionn bails out early on silentNeverType Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] more detailed error messages Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] resolves conflict in diagnosticMessages.json Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] update baseline for importHelpersES6 Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] remove redundent if and comment from parser Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] split up grammar/check/symbolLookup Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com> * [squash] reword message for existing left side of in-expression error Signed-off-by: Ashley Claymore <acutmore@users.noreply.github.com>
98 lines
3.5 KiB
TypeScript
98 lines
3.5 KiB
TypeScript
//// [privateNameInInExpressionTransform.ts]
|
|
class Foo {
|
|
#field = 1;
|
|
#method() {}
|
|
static #staticField= 2;
|
|
static #staticMethod() {}
|
|
|
|
check(v: any) {
|
|
#field in v; // expect Foo's 'field' WeakMap
|
|
#method in v; // expect Foo's 'instances' WeakSet
|
|
#staticField in v; // expect Foo's constructor
|
|
#staticMethod in v; // expect Foo's constructor
|
|
}
|
|
precedence(v: any) {
|
|
// '==' and '||' have lower precedence than 'in'
|
|
// 'in' naturally has same precedence as 'in'
|
|
// '<<' has higher precedence than 'in'
|
|
|
|
v == #field in v || v; // Good precedence: (v == (#field in v)) || v
|
|
|
|
v << #field in v << v; // Good precedence (SyntaxError): (v << #field) in (v << v)
|
|
|
|
v << #field in v == v; // Good precedence (SyntaxError): ((v << #field) in v) == v
|
|
|
|
v == #field in v in v; // Good precedence: v == ((#field in v) in v)
|
|
|
|
#field in v && #field in v; // Good precedence: (#field in v) && (#field in v)
|
|
}
|
|
invalidLHS(v: any) {
|
|
'prop' in v = 10;
|
|
#field in v = 10;
|
|
}
|
|
}
|
|
|
|
class Bar {
|
|
#field = 1;
|
|
check(v: any) {
|
|
#field in v; // expect Bar's 'field' WeakMap
|
|
}
|
|
}
|
|
|
|
function syntaxError(v: Foo) {
|
|
return #field in v; // expect `return in v` so runtime will have a syntax error
|
|
}
|
|
|
|
export { }
|
|
|
|
|
|
//// [privateNameInInExpressionTransform.js]
|
|
var __classPrivateFieldIn = (this && this.__classPrivateFieldIn) || function(state, receiver) {
|
|
if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
|
|
return typeof state === "function" ? receiver === state : state.has(receiver);
|
|
};
|
|
var _Foo_instances, _a, _Foo_field, _Foo_method, _Foo_staticField, _Foo_staticMethod, _Bar_field;
|
|
class Foo {
|
|
constructor() {
|
|
_Foo_instances.add(this);
|
|
_Foo_field.set(this, 1);
|
|
}
|
|
check(v) {
|
|
__classPrivateFieldIn(_Foo_field, v); // expect Foo's 'field' WeakMap
|
|
__classPrivateFieldIn(_Foo_instances, v); // expect Foo's 'instances' WeakSet
|
|
__classPrivateFieldIn(_a, v); // expect Foo's constructor
|
|
__classPrivateFieldIn(_a, v); // expect Foo's constructor
|
|
}
|
|
precedence(v) {
|
|
// '==' and '||' have lower precedence than 'in'
|
|
// 'in' naturally has same precedence as 'in'
|
|
// '<<' has higher precedence than 'in'
|
|
v == __classPrivateFieldIn(_Foo_field, v) || v; // Good precedence: (v == (#field in v)) || v
|
|
v << in v << v; // Good precedence (SyntaxError): (v << #field) in (v << v)
|
|
v << in v == v; // Good precedence (SyntaxError): ((v << #field) in v) == v
|
|
v == __classPrivateFieldIn(_Foo_field, v) in v; // Good precedence: v == ((#field in v) in v)
|
|
__classPrivateFieldIn(_Foo_field, v) && __classPrivateFieldIn(_Foo_field, v); // Good precedence: (#field in v) && (#field in v)
|
|
}
|
|
invalidLHS(v) {
|
|
'prop' in v;
|
|
10;
|
|
__classPrivateFieldIn(_Foo_field, v);
|
|
10;
|
|
}
|
|
}
|
|
_a = Foo, _Foo_field = new WeakMap(), _Foo_instances = new WeakSet(), _Foo_method = function _Foo_method() { }, _Foo_staticMethod = function _Foo_staticMethod() { };
|
|
_Foo_staticField = { value: 2 };
|
|
class Bar {
|
|
constructor() {
|
|
_Bar_field.set(this, 1);
|
|
}
|
|
check(v) {
|
|
__classPrivateFieldIn(_Bar_field, v); // expect Bar's 'field' WeakMap
|
|
}
|
|
}
|
|
_Bar_field = new WeakMap();
|
|
function syntaxError(v) {
|
|
return in v; // expect `return in v` so runtime will have a syntax error
|
|
}
|
|
export {};
|