| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 | import {    AST_Array,    AST_Chain,    AST_Constant,    AST_Dot,    AST_ImportMeta,    AST_Node,    AST_Object,    AST_ObjectKeyVal,    AST_PropAccess,    AST_SymbolDeclaration,    AST_SymbolRef,    AST_Toplevel,    TreeTransformer,} from "../ast.js";import { make_node, noop, HOP } from "../utils/index.js";import { make_node_from_constant } from "./common.js";import { is_lhs } from "./inference.js";(function(def_find_defs) {    function to_node(value, orig) {        if (value instanceof AST_Node) {            if (!(value instanceof AST_Constant)) {                // Value may be a function, an array including functions and even a complex assign / block expression,                // so it should never be shared in different places.                // Otherwise wrong information may be used in the compression phase                value = value.clone(true);            }            return make_node(value.CTOR, orig, value);        }        if (Array.isArray(value)) return make_node(AST_Array, orig, {            elements: value.map(function(value) {                return to_node(value, orig);            })        });        if (value && typeof value == "object") {            var props = [];            for (var key in value) if (HOP(value, key)) {                props.push(make_node(AST_ObjectKeyVal, orig, {                    key: key,                    value: to_node(value[key], orig)                }));            }            return make_node(AST_Object, orig, {                properties: props            });        }        return make_node_from_constant(value, orig);    }    AST_Toplevel.DEFMETHOD("resolve_defines", function(compressor) {        if (!compressor.option("global_defs")) return this;        this.figure_out_scope({ ie8: compressor.option("ie8") });        return this.transform(new TreeTransformer(function(node) {            var def = node._find_defs(compressor, "");            if (!def) return;            var level = 0, child = node, parent;            while (parent = this.parent(level++)) {                if (!(parent instanceof AST_PropAccess)) break;                if (parent.expression !== child) break;                child = parent;            }            if (is_lhs(child, parent)) {                return;            }            return def;        }));    });    def_find_defs(AST_Node, noop);    def_find_defs(AST_Chain, function(compressor, suffix) {        return this.expression._find_defs(compressor, suffix);    });    def_find_defs(AST_Dot, function(compressor, suffix) {        return this.expression._find_defs(compressor, "." + this.property + suffix);    });    def_find_defs(AST_SymbolDeclaration, function() {        if (!this.global()) return;    });    def_find_defs(AST_SymbolRef, function(compressor, suffix) {        if (!this.global()) return;        var defines = compressor.option("global_defs");        var name = this.name + suffix;        if (HOP(defines, name)) return to_node(defines[name], this);    });    def_find_defs(AST_ImportMeta, function(compressor, suffix) {        var defines = compressor.option("global_defs");        var name = "import.meta" + suffix;        if (HOP(defines, name)) return to_node(defines[name], this);    });})(function(node, func) {    node.DEFMETHOD("_find_defs", func);});
 |