public override bool Walk(ObjectLiteral node) { // If a single file has a bunch of duplicate ObjectLiteral values with the same // property names we will merge them together into a single ObjectLiteralValue to // avoid an explosion in object literals. We only do this for literals with // at least one member defined. if (node.Properties.Length > 0) { // first see if we have a object literal that we should share with... string[] propNames = new string[node.Properties.Length]; for (int i = 0; i < node.Properties.Length; i++) { string propName = null; if (node.Properties[i].Name.Value != null) { propName = node.Properties[i].Name.Value.ToString(); } propNames[i] = propName; } var key = new ObjectLiteralKey(propNames); IAnalysisSet value; if (_scope.GlobalEnvironment.TryGetNodeValue( NodeEnvironmentKind.ObjectLiteralValue, key, out value)) { // cache the value under our node... _scope.GlobalEnvironment.AddNodeValue( NodeEnvironmentKind.ObjectLiteralValue, node, value ); } else { // create the value and cache it under oru node and the // shared key. var objLiteral = new ObjectLiteralValue(_entry, node); _scope.GlobalEnvironment.AddNodeValue( NodeEnvironmentKind.ObjectLiteralValue, node, objLiteral.Proxy ); _scope.GlobalEnvironment.AddNodeValue( NodeEnvironmentKind.ObjectLiteralValue, key, objLiteral.Proxy ); } } else { _scope.GlobalEnvironment.AddNodeValue( NodeEnvironmentKind.ObjectLiteralValue, node, new ObjectLiteralValue(_entry, node).Proxy ); } return base.Walk(node); }
private static IAnalysisSet NewObject(FunctionValue func, Node node, AnalysisUnit unit, IAnalysisSet @this, IAnalysisSet[] args) { IAnalysisSet value; if (!unit._env.GlobalEnvironment.TryGetNodeValue(NodeEnvironmentKind.ObjectCall, node, out value)) { var objValue = new ObjectLiteralValue( unit.ProjectEntry, node ); value = objValue.SelfSet; unit._env.GlobalEnvironment.AddNodeValue(NodeEnvironmentKind.ObjectCall, node, objValue.SelfSet); } return value; }