private void CompileInlineMethod(IMethod method, InlineMethodInfo info) { var jsMethod = method.Data as JsGeneratedMethod; if (jsMethod != null) { return; } var func = CompileInlineFunction(method, info); var klass = CompileClass(method.DeclaringType); jsMethod = new JsGeneratedMethod(method.JsFullName(), func); method.Data = jsMethod; klass.Add(jsMethod); }
private static JsFunction CompileInlineFunction(IMethod method, InlineMethodInfo info) { var parameters = method.JsParams(); var func = new JsFunction(null, parameters); switch (info.Kind) { case InlineKind.Property: //TODO: support static properties var propertyName = info.Name; if (method.IsSetter()) { func.Body.Add("this".Id().Set(propertyName, parameters[0].Id())); } else { func.Body.Add("this".Id().Get(propertyName).Return()); } break; case InlineKind.Operator: var text = "return "; for (int i = 0; i < method.Parameters.Count; i++) { if (i > 0) { text += info.Name; } text += parameters[i]; } text += ";"; func.Body.Add(new JsText(text)); break; default: var type = method.DeclaringType; //TODO: use ABC, pfx meta attributes var typeName = type.Namespace == "Avm" ? type.Name : type.JsFullName(method); var target = method.IsStatic ? typeName.Id() : "this".Id(); func.Body.Add(target.Get(info.Name).Call(parameters.Select(x => x.Id()).ToArray()).Return()); break; } return(func); }