All files / src/compiler/phases/2-analyze/visitors MemberExpression.js

100% Statements 55/55
100% Branches 22/22
100% Functions 1/1
100% Lines 50/50

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 512x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 5399x 4423x 4423x 1x 1x 4423x 5398x 5399x 1803x 1803x 5398x 5399x 1271x 1271x 5398x 5399x 175x 175x 175x 161x 161x 161x 49x 49x 49x 44x 44x 44x 49x 7x 7x 49x 161x 175x 5398x 5398x 5398x  
/** @import { MemberExpression } from 'estree' */
/** @import { Context } from '../types' */
import * as e from '../../../errors.js';
import * as w from '../../../warnings.js';
import { object } from '../../../utils/ast.js';
import { is_state_source } from '../../3-transform/client/utils.js';
import { is_pure, is_safe_identifier } from './shared/utils.js';
 
/**
 * @param {MemberExpression} node
 * @param {Context} context
 */
export function MemberExpression(node, context) {
	if (node.object.type === 'Identifier' && node.property.type === 'Identifier') {
		const binding = context.state.scope.get(node.object.name);
		if (binding?.kind === 'rest_prop' && node.property.name.startsWith('$$')) {
			e.props_illegal_name(node.property);
		}
	}
 
	if (context.state.expression && !is_pure(node, context)) {
		context.state.expression.has_state = true;
	}
 
	if (!is_safe_identifier(node, context.state.scope)) {
		context.state.analysis.needs_context = true;
	}
 
	if (context.state.reactive_statement) {
		const left = object(node);
 
		if (left !== null) {
			const binding = context.state.scope.get(left.name);
 
			if (binding && binding.kind === 'normal') {
				if (
					binding.scope === context.state.analysis.module.scope ||
					binding.declaration_kind === 'import' ||
					(binding.initial &&
						binding.initial.type !== 'ArrayExpression' &&
						binding.initial.type !== 'ObjectExpression')
				) {
					w.reactive_declaration_non_reactive_property(node);
				}
			}
		}
	}
 
	context.next();
}