protected IField GenerateBackingField(IProperty pe) { var field = GenerateFakeField(pe); field.Name = "_" + SkJs.GetEntityJsName(pe); return(field); }
public TsFunction Visit(IMethod me) { if (me is FakeMethod) { return(null); } TsFunction me2 = new TsFunction { Name = SkJs.GetEntityJsName(me), IsStatic = me.IsStatic, Parameters = me.Parameters.Select(Visit).ToList() }; if (me.SymbolKind == SymbolKind.Constructor) { me2.Name = SkJs.GetEntityJsName(me);// "constructor"; //if (me2.Name.StartsWith(".")) //me2.IsConstructor = true; } else { me2.Type = Visit(me.ReturnType); me2.TypeParameters = me.TypeParameters.Select(Visit).ToList(); } return(me2); }
public override JsNode ExportMethod(IMethod me) { if (Sk.IsGlobalMethod(me)) { return(CreateGlobalMemberConverter().ExportMethod(me)); } var node = base.ExportMethod(me); if (node == null) { return(node); } if (!node.Is(JsNodeType.Function)) { return(node); } var func = (JsFunction)node; func.Name = null; var ce = me.GetDeclaringTypeDefinition(); var member = ExportTypePrefix(ce, me.IsStatic); member = member.Member(SkJs.GetEntityJsName(me)); if (LongFunctionNames) { func.Name = SkJs.GetLongFunctionName(me); } var st = member.Assign(func).Statement(); return(st); }
private JsClrAttribute ExportAttribute(IEntity parent, IAttribute att) { var attCtor = att.Constructor; var attType = att.AttributeType; var target = GetAttributeTarget(parent, att); var jsAtt = new JsClrAttribute { targetType = target.Key, targetMemberName = target.Value, typeName = SkJs.GetEntityJsName(attType), ctorName = SkJs.GetEntityJsName(attCtor), }; if (att.PositionalArguments.IsNotNullOrEmpty()) { jsAtt.positionalArguments = new JsArray <object>(); var args = att.PositionalArguments.Select(exp => ImportAttributeValue(exp)).ToList(); jsAtt.positionalArguments.AddRange(args); } if (att.NamedArguments.IsNotNullOrEmpty()) { jsAtt.namedArguments = new JsObject(); foreach (var arg in att.NamedArguments) { jsAtt.namedArguments[arg.Key.Name] = ImportAttributeValue(arg.Value); } } return(jsAtt); }
protected virtual JsNode ExportPropertyInfo(IProperty pe) { var name = SkJs.GetEntityJsName(pe) + "$$"; var value = Js.String(pe.GetPropertyTypeRef().GetFullyQualifiedCLRName()); //CurrentType.GetDefinition(pe.IsStatic)[name] = value; return(Js.JsonNameValue(name, value)); }
protected IField GenerateBackingField(IProperty pe) { var field = GenerateFakeField(pe); // 这里容易冲突,因此前缀复杂一点好 field.Name = AutoPropertyPrefix + SkJs.GetEntityJsName(pe); return(field); }
public JsNode VisitMemberResolveResult(MemberResolveResult res) { var me = res.Member; JsNode node2; bool enumValuesAsNames; if (me == null) //TODO: dynamics { throw new NotImplementedException(); //var node3 = Js.Member(node.MemberName); //if (node.Target != null) // node3.PreviousMember = VisitExpression(node.Target); //return node3; } else if (Sk.IsEntityFunctionProperty(res.Member, res))//(Entity)node.entity)) { var pe = (IProperty)me; var xxx = new CSharpInvocationResolveResult(res.TargetResult, pe.Getter, null); node2 = Visit(xxx); return(node2); } else if (me.IsEnumMember() && Sk.UseJsonEnums(me, out enumValuesAsNames)) { var me2 = (IField)me; if (enumValuesAsNames) { return(Js.String(SkJs.GetEntityJsName(me2))); } else { return(Js.Value(me2.ConstantValue)); } } //TODO: Support a way to override this (JsField.ConstantInlining=false) else if (res.IsCompileTimeConstant && !me.IsEnumMember()) { return(Js.Value(res.ConstantValue)); } else { var node3 = SkJs.EntityToMember(me); node2 = node3; if (res.TargetResult != null && !me.IsStatic()) { var instanceContext = VisitExpression(res.TargetResult); if (node3.Name.IsNullOrEmpty()) //support Name="" { node2 = instanceContext; } else { node3.PreviousMember = instanceContext; } } } return(node2); }
public override JsNode ExportConstructor(IMethod ctor) { var ctorName = SkJs.GetEntityJsName(ctor); var func = base.ExportConstructor(ctor); //CurrentType.definition[ctorName] = func; return(Js.JsonNameValue(ctorName, (JsExpression)func)); //return func; }
public virtual JsNode ExportConstructor(IMethod ctor) { var ctorName = SkJs.GetEntityJsName(ctor); var func = new JsFunction { Parameters = new List <string>() }; func.Block = ExportConstructorBody(ctor); ExportConstructorParameters(ctor, func); return(func); }
public virtual JsNode ExportMethod(IMethod me) { var jma = Sk.GetJsMethodAttribute(me); if (jma != null && jma.GlobalCode) { var block = ExportMethodBody(me); return(new JsUnit { Statements = block.Statements }); } var func = new JsFunction(); func.Parameters = ExportMethodParameters(me); func.Name = SkJs.GetEntityJsName(me); func.Block = ExportMethodBody(me); func = ApplyYield(func); return(func); }
private KeyValuePair <string, string> GetAttributeTarget(IEntity parent, IAttribute att) { if (parent is ITypeDefinition) { return(new KeyValuePair <string, string>("type", null)); } else if (parent.SymbolKind == SymbolKind.Property) { return(new KeyValuePair <string, string>("property", SkJs.GetEntityJsName(parent))); } else if (parent.SymbolKind == SymbolKind.Method) { var method = (IMethod)parent; if (method.IsConstructor) { return(new KeyValuePair <string, string>("constructor", SkJs.GetEntityJsName(method))); } else { return(new KeyValuePair <string, string>("method", SkJs.GetEntityJsName(method))); } } throw new NotImplementedException("GetAttributeTarget no implemented for member: " + parent); }
public TsType Visit(ITypeDefinition ce) { var name = SkJs.GetEntityJsName(ce); var ce2 = new TsType { Name = name, Kind = (ce.IsInterface() || ce.IsDelegate()) ? TsTypeKind.Interface : TsTypeKind.Class, TypeParameters = ce.TypeParameters.Select(Visit).ToList() }; if (name.Contains(".")) { var pair = name.SplitAt(name.LastIndexOf("."), true); ce2.Name = pair[1]; ce2.ModuleName = pair[0]; ce2.IsModuleExport = true; } if (ce.IsDelegate()) { var func = Visit(ce.GetDelegateInvokeMethod()); //func.IsCallSignature = true; func.Name = null; ce2.Members.Add(func); } else { var members = TypeConverter.ClrConverter.GetMembersToExport(ce); var members2 = members.Select(Visit).Where(t => t != null).ToList(); ce2.Members.AddRange(members2); if (ce2.Kind == TsTypeKind.Class) { ce2.Members.OfType <TsFunction>().Where(t => !t.IsConstructor || !t.Type.IsNullOrVoid()).ForEach(t => t.Body = "return null;"); ce2.Members.OfType <TsFunction>().Where(t => t.IsConstructor).ForEach(t => t.Body = ""); } } return(ce2); }
internal JsExpression InitializersToJson(IList <ResolveResult> initializerStatements, IType type) { //if (Sk.IsNativeArrayEnumerator(type.GetDefinition())) //FIX for issue 325: if (Sk.IsNativeArrayEnumerator(type.GetDefinition()) && (initializerStatements.IsEmpty() || initializerStatements[0] is CSharpInvocationResolveResult)) { var items = initializerStatements.Cast <CSharpInvocationResolveResult>().Select(t => t.Arguments[0]).ToList(); var items2 = VisitExpressions(items); var arr = Js.NewJsonArray(items2.ToArray()); return(arr); } else { var json = Js.Json(); foreach (var st in initializerStatements) { if (st is OperatorResolveResult) { var op = (OperatorResolveResult)st; var mrr = (MemberResolveResult)op.Operands[0]; var name = SkJs.GetEntityJsName(mrr.Member); var value = VisitExpression(op.Operands[1]); var pair = Js.JsonNameValue(name, value); if (mrr.TargetResult is MemberResolveResult) //happens when using object initializers to set inner properties, e.g. new Parent { Child = { Name="ggg" } } { var targetMrr = (MemberResolveResult)mrr.TargetResult; var name2 = SkJs.GetEntityJsName(targetMrr.Member); var innerJson = Js.Json(); innerJson.Add(pair); pair = Js.JsonNameValue(name2, innerJson); } json.Add(pair); } else if (st is InvocationResolveResult) { var irr = (InvocationResolveResult)st; var targetMrr = irr.TargetResult as MemberResolveResult; if (targetMrr == null) { throw new CompilerException(st.GetFirstNode(), "Expected MemberResolveResult"); } var name = SkJs.GetEntityJsName(targetMrr.Member); if (irr.Arguments.Count != 1) { throw new CompilerException(st.GetFirstNode(), "Expected one argument, not " + name + " " + irr.Arguments.Count); } var value = VisitExpression(irr.Arguments[0]); var jsonMember = json.NamesValues.NotNull().FirstOrDefault(t => t.Name.Name == name); if (jsonMember == null) { json.Add(name, Js.NewJsonArray(value)); } else { var array = jsonMember.Value as JsJsonArrayExpression; if (array == null) { throw new CompilerException(st.GetFirstNode(), "json member value array not found " + name); } array.Items.Add(value); } } else { throw new NotImplementedException(); } } //var inits2 = initializerStatements.Select(t => Visit(t)).ToList(); //var namesValues = inits2.Cast<JsBinaryExpression>().Select(t => Js.JsonNameValue(((JsMemberExpression)t.Left).Name, t.Right)).ToList(); //var json = Js.Json(); //json.NamesValues = namesValues; return(json); } }
public JsNode VisitMemberResolveResult(MemberResolveResult res) { var me = res.Member; JsNode node2; bool enumValuesAsNames; if (me == null) //TODO: dynamics { throw new NotImplementedException(); //var node3 = Js.Member(node.MemberName); //if (node.Target != null) // node3.PreviousMember = VisitExpression(node.Target); //return node3; } else if (Sk.IsEntityFunctionProperty(res.Member, res))//(Entity)node.entity)) { var pe = (IProperty)me; var xxx = new CSharpInvocationResolveResult(res.TargetResult, pe.Getter, null); var fn = res.GetFirstNode(); qiucw.InvokeRR2Location.Add(xxx, new qiucw.InvocationLocation { FileName = fn.GetFileName(), Line = fn.StartLocation.Line }); { node2 = Visit(xxx); } qiucw.InvokeRR2Location.Remove(xxx); return(node2); } else if (me.IsEnumMember() && Sk.UseJsonEnums(me, out enumValuesAsNames)) { var me2 = (IField)me; if (enumValuesAsNames) { return(Js.String(SkJs.GetEntityJsName(me2))); } else { return(Js.Value(me2.ConstantValue)); } } //TODO: Support a way to override this (JsField.ConstantInlining=false) else if (res.IsCompileTimeConstant && !me.IsEnumMember()) { var nodes = res.GetNodes(); if (nodes.IsNotNullOrEmpty()) { if (nodes[0] != null) { bool isPrimitiveExpr = nodes[0] is PrimitiveExpression; if (!isPrimitiveExpr) { return(Js.Value(res.ConstantValue, string.Format(" /* {0} */", nodes[0].ToString()))); } } } return(Js.Value(res.ConstantValue)); } else { var node3 = SkJs.EntityToMember(me); qiucw.CheckAddInvocation(res, node3.Name); node2 = node3; if (res.TargetResult != null && !me.IsStatic()) { var instanceContext = VisitExpression(res.TargetResult); if (node3.Name.IsNullOrEmpty()) //support Name="" { node2 = instanceContext; } else { node3.PreviousMember = instanceContext; } } } return(node2); }
private TsTypeRef Visit(IType type) { if (type == null) { return new TsTypeRef { Name = "void" } } ; var typeDef = type.GetDefinition(); if (typeDef != null) { var ktc = typeDef.KnownTypeCode; if (ktc != KnownTypeCode.None) { if (ktc == KnownTypeCode.Void) { return new TsTypeRef { Name = "void" } } ; else if (ktc == KnownTypeCode.Object) { return new TsTypeRef { Name = "any" } } ; else if (ktc == KnownTypeCode.String) { return new TsTypeRef { Name = "string" } } ; else if (ktc == KnownTypeCode.Boolean) { return new TsTypeRef { Name = "boolean" } } ; else if (ktc == KnownTypeCode.Int32 || ktc == KnownTypeCode.Int32 || ktc == KnownTypeCode.Int16 || ktc == KnownTypeCode.Int64 || ktc == KnownTypeCode.Double || ktc == KnownTypeCode.Single || ktc == KnownTypeCode.SByte || ktc == KnownTypeCode.Byte || ktc == KnownTypeCode.UInt16 || ktc == KnownTypeCode.UInt32 || ktc == KnownTypeCode.UInt64 || ktc == KnownTypeCode.Decimal ) { return new TsTypeRef { Name = "number" } } ; } if (Sk.IsJsonMode(typeDef)) { return new TsTypeRef { Name = "Object" } } ; if (type.Kind == TypeKind.Delegate && !Sk.IsJsExported(type.GetDefinition())) { var func = Visit(type.GetDelegateInvokeMethod()); func.Name = null; func.IsCallSignature = true; return(new TsTypeRef { AnonymousCallSignature = func }); } } var tr2 = new TsTypeRef { Name = SkJs.GetEntityJsName(type) }; tr2.GenericArguments = type.TypeArguments.Select(Visit).ToList(); if (tr2.Name == "Array" && tr2.GenericArguments.Count == 0) { tr2.GenericArguments.Add(new TsTypeRef { Name = "any" }); } return(tr2); }
public static ResolveResult GetValueTypeInitializer(IType ce, NProject Project) { var fullName = SkJs.GetEntityJsName(ce); if (ce.FullName == "System.Nullable") { return(Cs.Null()); } if (ce is ITypeDefinition) { var def = (ITypeDefinition)ce; if (def.KnownTypeCode != KnownTypeCode.None) { if (def.KnownTypeCode == KnownTypeCode.Boolean) { return(Cs.Value(false, Project)); } else if (def.KnownTypeCode == KnownTypeCode.Char) { return(Cs.Value('\0', Project)); } else if (def.KnownTypeCode == KnownTypeCode.SByte || def.KnownTypeCode == KnownTypeCode.Int16 || def.KnownTypeCode == KnownTypeCode.Int32 || def.KnownTypeCode == KnownTypeCode.Int64 || def.KnownTypeCode == KnownTypeCode.UInt16 || def.KnownTypeCode == KnownTypeCode.UInt32 || def.KnownTypeCode == KnownTypeCode.UInt64 || def.KnownTypeCode == KnownTypeCode.Byte || def.KnownTypeCode == KnownTypeCode.Decimal || def.KnownTypeCode == KnownTypeCode.Double || def.KnownTypeCode == KnownTypeCode.Single ) { return(Cs.Value(0, Project)); } } } if (ce.Kind == TypeKind.Enum) { var en = ce; var enumMembers = en.GetFields(); var defaultEnumMember = enumMembers.Where(t => (t.ConstantValue is int) && (int)t.ConstantValue == 0).FirstOrDefault() ?? enumMembers.FirstOrDefault(); if (defaultEnumMember != null) { return(defaultEnumMember.AccessSelf());//.Access().Member(c.CreateTypeRef(en), defaultEnumMember); } else { return(null); } } else if (ce.GetEntityType().FullName == "System.DateTime") { var minDateFe = ce.GetFields(t => t.Name == "MinValue").First(); return(minDateFe.AccessSelf());// c.Member(c.Class(c.DateTimeType), minDateFe); } else { return(Cs.New(ce)); } }
protected JsBlock ExportMethodBody(IMethod me) { if (CompilerConfiguration.Current.EnableLogging) { Log.Debug("JsTypeImporter: Visit Method: " + me.ToString()); } var nativeCode = Sk.GetNativeCode(me); if (nativeCode != null) { var block = Js.Block().Add(Js.CodeStatement(nativeCode)); //TODO: double semicolon? return(block); } var def = me.GetDefinition(); if (def == null || def.IsNull) { if (me.IsAutomaticEventAccessor()) { if (me.IsEventAddAccessor()) { var node = GenerateAutomaticEventAccessor((IEvent)me.GetOwner(), false); return(node.Block); } else if (me.IsEventRemoveAccessor()) { var node = GenerateAutomaticEventAccessor((IEvent)me.GetOwner(), true); return(node.Block); } } else if (me.IsAutomaticPropertyAccessor()) { var bf = Js.Member(AutoPropertyPrefix + SkJs.GetEntityJsName(me.AccessorOwner)); if (!me.IsStatic) { bf.PreviousMember = Js.This(); } else if (!Sk.IsGlobalMethod(me)) { bf.PreviousMember = SkJs.EntityToMember(me.DeclaringTypeDefinition); } if (me.IsGetter()) { return(Js.Block().Add(Js.Return(bf))); } else { return(Js.Block().Add(bf.Assign(Js.Member("value")).Statement())); } } return(null); } var block2 = (JsBlock)AstNodeConverter.Visit(def); block2.ContainsYield = false; if (def.Descendants.OfType <YieldReturnStatement>().FirstOrDefault() != null) { block2.ContainsYield = true; if (!AstNodeConverter.SupportClrYield) { if (block2.Statements == null) { block2.Statements = new List <JsStatement>(); } //block2.Statements.Insert(0, Js.Var("$yield", Js.NewJsonArray()).Statement()); //block2.Statements.Add(AstNodeConverter.GenerateYieldReturnStatement(me)); } } return(block2); }
protected string GetJsTypeName(IType etr) { return(SkJs.GetEntityJsName(etr));//.FixClassName(etr, true); }