private void ProcessNamespace(string ns) { if (processedNamespaces.Contains(ns)) { return; } processedNamespaces.Add(ns); var lastDotIndex = ns.LastIndexOf('.'); var parentNamespace = lastDotIndex != -1 ? ns.Substring(0, lastDotIndex) : null; if (parentNamespace != null) { ProcessNamespace(parentNamespace); } JsBinaryExpression result; if (lastDotIndex == -1) { result = Js.Assign(Js.Reference("window").Member(ns), Js.Object()); } else { result = Js.Assign(Js.Reference(ns), Js.Object()); } result.Right = Js.Binary(JsBinaryOperator.LogicalOr, result.Left, result.Right); body.Express(result); }
public void TestMethod1() { var x = Js.Variable("x"); var y = Js.Variable("y"); var t = Js.Assign( Js.Variable("fn"), Js.Function(new [] { Js.If( Js.Equality(x, y), Js.MultiplyAssign(x, y)) }, "x", "y") ); }
private JsBlockStatement CreateProperty(IPropertySymbol property) { var block = new JsBlockStatement(); var propertyName = property.GetMemberName(); var backingField = property.GetBackingFieldName(); var valueParameter = Js.Parameter("value"); block.Add(idioms.StoreInPrototype(backingField, Js.Null())); if (property.GetMethod != null) { block.Add(idioms.StoreInPrototype(property.GetMethod.GetMemberName(), Js.Function().Body(Js.Return(Js.This().Member(backingField))))); } if (property.SetMethod != null) { block.Add(idioms.StoreInPrototype(property.SetMethod.GetMemberName() + propertyName, Js.Function(valueParameter).Body( Js.Assign(Js.This().Member(backingField), valueParameter.GetReference())))); } return(block); }
void TransformIntoBaseMethodCallIfNeeded(CSharpInvocationResolveResult res, JsInvocationExpression node2) { var target = res.TargetResult as ThisResolveResult; if (target != null && target.CausesNonVirtualInvocation) //base. { //var info = res.GetInfo(); //var node = info.Nodes.FirstOrDefault(); var ce = target.Type;// node.FindThisEntity(); if (ce != null && Sk.IsExtJsType(ce.GetDefinitionOrArrayType())) { node2.Member = Js.This().Member("callParent"); if (node2.Arguments.IsNotNullOrEmpty()) { node2.Arguments = new List <JsExpression> { Js.NewJsonArray(node2.Arguments.ToArray()) } } ; //var me2 = (node2.Member as JsMemberExpression); //me2.Name = "callParent"; return; } IMethod me2; var me = res.Member; if (me is IProperty) { me2 = ((IProperty)me).Getter; } else if (me is IMethod) { me2 = (IMethod)res.Member; } else { throw new Exception("Can't resolve method from member: " + res.Member); } var member = SkJs.EntityMethodToJsFunctionRef(me2); member = member.Member("call"); node2.Member = member; if (node2.Arguments == null) { node2.Arguments = new List <JsExpression>(); } node2.Arguments.Insert(0, Js.This()); } } void ProcessByRefs1() { ByRefs = new List <ByReferenceResolveResult>(); ByRefIndexes = new List <int>(); RefToRefs = new List <int>(); var c = 0; foreach (var bin in PrmBindings) { var binding = bin.Binding; var byRef = binding.CallResult as ByReferenceResolveResult; if (byRef == null) { c++; continue; } var x = byRef.ElementResult as LocalResolveResult; if (x != null && x.Variable != null && x.Variable.Type.Kind == TypeKind.ByReference) { if (binding.Parameter.IsRef || binding.Parameter.IsOut) { RefToRefs.Add(c); } c++; continue; } ByRefs.Add(byRef); ByRefIndexes.Add(c); c++; } } void ProcessByRefs2() { var c = 0; for (var i = 0; i < Node2.Arguments.Count; i++) { JsMemberExpression jsmex = Node2.Arguments[i] as JsMemberExpression; if (jsmex != null) { if (RefToRefs.Contains(i)) { Node2.Arguments[i] = jsmex.PreviousMember; //remove the .Value ref wrapper } else if (ByRefIndexes.Contains(i)) { Node2.Arguments[i] = Js.Member(RefIndexToName(c)); c++; } } } } void ProcessByRefs3() { if (ByRefs.IsNotNullOrEmpty()) { var func = Js.Function(); //It must assigned to a temporary variable, because typed arrays do not acceppt json. for (var i = 0; i < ByRefs.Count; i++) { var byRef = ByRefs[i]; func.Add(Js.Var(RefIndexToName(i), Js.Json().Add("Value", VisitExpression(byRef))).Statement()); } func.Add(Js.Var("$res", Node2).Statement()); for (var i = 0; i < ByRefs.Count; i++) { var byRef = ByRefs[i]; func.Add(Js.Assign(VisitExpression(byRef), Js.Member(Js.Member(RefIndexToName(i)), "Value")).Statement()); } func.Add(Js.Return(Js.Member("$res"))); Node2 = Importer.WrapFunctionAndInvoke(Res, func); } }