Skip to content

Commit

Permalink
Improve coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed May 16, 2021
1 parent 87e8029 commit 17dfcb7
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 23 deletions.
10 changes: 2 additions & 8 deletions src/ast/nodes/MemberExpression.ts
Expand Up @@ -24,12 +24,7 @@ import Identifier from './Identifier';
import Literal from './Literal';
import * as NodeType from './NodeType';
import PrivateIdentifier from './PrivateIdentifier';
import {
ExpressionEntity,
LiteralValueOrUnknown,
UnknownValue,
UNKNOWN_EXPRESSION
} from './shared/Expression';
import { ExpressionEntity, LiteralValueOrUnknown, UnknownValue, UNKNOWN_EXPRESSION } from './shared/Expression';
import { ExpressionNode, IncludeChildren, NodeBase } from './shared/Node';
import SpreadElement from './SpreadElement';
import Super from './Super';
Expand Down Expand Up @@ -211,12 +206,11 @@ export default class MemberExpression extends NodeBase implements DeoptimizableE
}

hasEffectsWhenAccessedAtPath(path: ObjectPath, context: HasEffectsContext): boolean {
if (path.length === 0) return false;
if (this.variable !== null) {
return this.variable.hasEffectsWhenAccessedAtPath(path, context);
}
if (this.replacement) {
return false;
return true;
}
return this.object.hasEffectsWhenAccessedAtPath([this.getPropertyKey(), ...path], context);
}
Expand Down
22 changes: 7 additions & 15 deletions src/ast/values.ts
Expand Up @@ -6,8 +6,7 @@ import { EMPTY_PATH, ObjectPath, ObjectPathKey } from './utils/PathTracker';

export interface MemberDescription {
callsArgs: number[] | null;
returns: { new (): ExpressionEntity } | null;
returnsPrimitive: ExpressionEntity | null;
returns: ExpressionEntity;
}

export interface MemberDescriptions {
Expand All @@ -34,8 +33,7 @@ export const UNDEFINED_EXPRESSION: ExpressionEntity = new (class UndefinedExpres
const returnsUnknown: RawMemberDescription = {
value: {
callsArgs: null,
returns: null,
returnsPrimitive: UNKNOWN_EXPRESSION
returns: UNKNOWN_EXPRESSION
}
};

Expand Down Expand Up @@ -66,8 +64,7 @@ export const UNKNOWN_LITERAL_BOOLEAN: ExpressionEntity = new (class UnknownBoole
const returnsBoolean: RawMemberDescription = {
value: {
callsArgs: null,
returns: null,
returnsPrimitive: UNKNOWN_LITERAL_BOOLEAN
returns: UNKNOWN_LITERAL_BOOLEAN
}
};

Expand Down Expand Up @@ -98,8 +95,7 @@ export const UNKNOWN_LITERAL_NUMBER: ExpressionEntity = new (class UnknownNumber
const returnsNumber: RawMemberDescription = {
value: {
callsArgs: null,
returns: null,
returnsPrimitive: UNKNOWN_LITERAL_NUMBER
returns: UNKNOWN_LITERAL_NUMBER
}
};

Expand Down Expand Up @@ -130,8 +126,7 @@ export const UNKNOWN_LITERAL_STRING: ExpressionEntity = new (class UnknownString
const returnsString: RawMemberDescription = {
value: {
callsArgs: null,
returns: null,
returnsPrimitive: UNKNOWN_LITERAL_STRING
returns: UNKNOWN_LITERAL_STRING
}
};

Expand Down Expand Up @@ -181,8 +176,7 @@ const literalStringMembers: MemberDescriptions = assembleMemberDescriptions(
replace: {
value: {
callsArgs: [1],
returns: null,
returnsPrimitive: UNKNOWN_LITERAL_STRING
returns: UNKNOWN_LITERAL_STRING
}
},
search: returnsNumber,
Expand Down Expand Up @@ -247,7 +241,5 @@ export function getMemberReturnExpressionWhenCalled(
memberName: ObjectPathKey
): ExpressionEntity {
if (typeof memberName !== 'string' || !members[memberName]) return UNKNOWN_EXPRESSION;
return members[memberName].returnsPrimitive !== null
? members[memberName].returnsPrimitive!
: new members[memberName].returns!();
return members[memberName].returns;
}
3 changes: 3 additions & 0 deletions test/form/samples/namespace-missing-export-effects/_config.js
@@ -0,0 +1,3 @@
module.exports = {
description: 'handles interacting with missing namespace members'
};
@@ -0,0 +1,5 @@
if (!undefined) console.log(1);
if (undefined()) console.log(2);
const foo = undefined;
foo.bar;
(0, undefined)();
7 changes: 7 additions & 0 deletions test/form/samples/namespace-missing-export-effects/main.js
@@ -0,0 +1,7 @@
import * as ns from './other.js';

if (!ns.foo) console.log(1);
if (ns.foo()) console.log(2);
const foo = ns.foo;
foo.bar;
(true && ns.foo)();
Empty file.

0 comments on commit 17dfcb7

Please sign in to comment.