private static void ProcessInitializer(OutputWriter writer, VariableDeclarationSyntax declaration, VariableDeclaratorSyntax variable) { var initializer = variable.Initializer; if (initializer != null) { if (CSharpExtensions.CSharpKind(initializer.Value) == SyntaxKind.CollectionInitializerExpression) { return; } var value = initializer.Value; var initializerType = TypeProcessor.GetTypeInfo(value); var memberaccessexpression = value as MemberAccessExpressionSyntax; var nameexpression = value as NameSyntax; var nullAssignment = value.ToFullString().Trim() == "null"; var shouldBox = initializerType.Type != null && (initializerType.Type.IsValueType) && !initializerType.ConvertedType.IsValueType; var shouldUnBox = initializerType.Type != null && !initializerType.Type.IsValueType && initializerType.ConvertedType.IsValueType; var isname = value is NameSyntax; var ismemberexpression = value is MemberAccessExpressionSyntax || (isname && TypeProcessor.GetSymbolInfo(value as NameSyntax).Symbol.Kind == SymbolKind.Method); var isdelegateassignment = ismemberexpression && initializerType.ConvertedType.TypeKind == TypeKind.Delegate; var isstaticdelegate = isdelegateassignment && ((memberaccessexpression != null && TypeProcessor.GetSymbolInfo(memberaccessexpression).Symbol.IsStatic) || (isname && TypeProcessor.GetSymbolInfo(nameexpression).Symbol.IsStatic)); var shouldCast = initializerType.Type != initializerType.ConvertedType && initializerType.ConvertedType != null; if (nullAssignment) { if (initializerType.Type != null) //Nullable Support { if (initializerType.Type.Name == "Nullable") { var atype = TypeProcessor.ConvertType(initializerType.Type); writer.Write(atype + "()"); } } else { writer.Write("null"); } return; } if (shouldBox) { //Box writer.Write("BOX!(" + TypeProcessor.ConvertType(initializerType.Type) + ")("); //When passing an argument by ref or out, leave off the .Value suffix Core.Write(writer, value); writer.Write(")"); return; } if (shouldUnBox) { writer.Write("cast(" + TypeProcessor.ConvertType(initializerType.Type) + ")("); Core.Write(writer, value); writer.Write(")"); return; } if (initializer.Parent.Parent.Parent is FixedStatementSyntax) // Fixed is a bit special { //TODO write a better fix var type = TypeProcessor.GetTypeInfo(declaration.Type); writer.Write("cast(" + TypeProcessor.ConvertType(type.Type) + ")("); Core.Write(writer, value); writer.Write(")"); return; } if (isdelegateassignment) { var typeString = TypeProcessor.ConvertType(initializerType.ConvertedType); var createNew = !(value is ObjectCreationExpressionSyntax); if (createNew) { if (initializerType.ConvertedType.TypeKind == TypeKind.TypeParameter) { writer.Write(" __TypeNew!(" + typeString + ")("); } else { writer.Write("new " + typeString + "("); } } var isStatic = isstaticdelegate; // if (isStatic) // writer.Write("__ToDelegate("); MemberUtilities.WriteMethodPointer(writer, value); // if (isStatic) // writer.Write(")"); if (createNew) { writer.Write(")"); } return; } if (initializerType.Type == null && initializerType.ConvertedType == null) { writer.Write("null"); return; } Core.Write(writer, value); } else { writer.Write(TypeProcessor.DefaultValue(declaration.Type)); } }
public static void Go(OutputWriter writer, MemberDeclarationSyntax field, SyntaxTokenList modifiers, string name, TypeSyntax type, EqualsValueClauseSyntax initializerOpt = null, bool isThreadStatic = false) { writer.WriteIndent(); var typeinfo = TypeProcessor.GetTypeInfo(type); // var isPtr = typeinfo.Type != null && (typeinfo.Type.IsValueType || typeinfo.Type.TypeKind==TypeKind.TypeParameter) ? "" : ""; var typeStringNoPtr = TypeProcessor.ConvertType(type); var typeString = typeStringNoPtr + " "; var isConst = IsConst(modifiers, initializerOpt, type); var isStatic = isConst; //Handle Auto Properties // if (modifiers.Any(SyntaxKind.PrivateKeyword)) // Reflection cannot work with this, cant get address or set value // writer.Write("private "); if (modifiers.Any(SyntaxKind.PublicKeyword) || modifiers.Any(SyntaxKind.InternalKeyword) || modifiers.Any(SyntaxKind.ProtectedKeyword) || modifiers.Any(SyntaxKind.AbstractKeyword)) { writer.Write("public "); } if (isThreadStatic) { writer.Write("static "); } if (modifiers.Any(SyntaxKind.StaticKeyword) || modifiers.Any(SyntaxKind.ConstKeyword)) { isStatic = true; writer.Write("__gshared "); } if (isConst && typeinfo.Type.IsPrimitive()) { writer.Write("const "); //const has interesting semantics in Dlang } var @event = field is EventFieldDeclarationSyntax; ITypeSymbol iface; ISymbol[] proxies; bool isInterface = false; // var ename = MemberUtilities.GetMethodName(field, ref isInterface, out iface, out proxies); if (@event) { typeString = ("__Event!(" + typeString + ")"); if (field.Parent is InterfaceDeclarationSyntax) { //writer.Write(typeString); writer.WriteLine(typeString + " " + name + "(" + TypeProcessor.ConvertType(field.Parent) + " __ij)" + "@property;"); return; } } writer.Write(typeString); // if (isStatic) // writer.Write(typeString); writer.Write(name); if (isStatic) { // var fieldInfo = TypeProcessor.GetDeclaredSymbol(field.Parent); // if (fieldInfo != null) // writer.Write((!string.IsNullOrEmpty(fieldInfo.ContainingNamespace.FullName())?(fieldInfo.ContainingNamespace.FullName()+".") :"") + fieldInfo.Name+"."+name); // writer.Write(name); } if (!isStatic || isConst) { if (initializerOpt != null) { writer.Write(String.Format(" = cast({0})", typeString)); if (CSharpExtensions.CSharpKind(initializerOpt.Value) == SyntaxKind.CollectionInitializerExpression || CSharpExtensions.CSharpKind(initializerOpt.Value) == SyntaxKind.ArrayInitializerExpression) { // writer.Write("gc::gc_ptr< " + typeStringNoPtr + " >("); writer.Write(" new " + typeString + " ("); var intializer = initializerOpt.Value as InitializerExpressionSyntax; intializer.WriteArrayInitializer(writer, type); writer.Write(")"); } else { Core.Write(writer, initializerOpt.Value); } } else { // if (typeinfo.Type.TypeKind != TypeKind.Struct) { writer.Write(" = "); if (typeinfo.Type.TypeKind == TypeKind.Delegate) { writer.Write("new " + typeString + "()"); } else { writer.Write(TypeProcessor.DefaultValue(type)); } } } } else { var staticWriter = new TempWriter(); if (initializerOpt != null) { staticWriter.Write(name); staticWriter.Write(" = "); if (CSharpExtensions.CSharpKind(initializerOpt.Value) == SyntaxKind.CollectionInitializerExpression || CSharpExtensions.CSharpKind(initializerOpt.Value) == SyntaxKind.ArrayInitializerExpression) { staticWriter.Write("new " + typeStringNoPtr + " ("); var intializer = initializerOpt.Value as InitializerExpressionSyntax; intializer.WriteArrayInitializer(staticWriter, type); staticWriter.Write(")"); } else { Core.Write(staticWriter, initializerOpt.Value); } staticWriter.Write(";"); staticWriter.WriteLine(); Context.Instance.StaticInits.Add(staticWriter.ToString()); } else if (typeinfo.Type.TypeKind != TypeKind.Struct) { staticWriter.Write(name); staticWriter.Write(" = "); if (typeinfo.Type.TypeKind == TypeKind.Delegate) { staticWriter.Write("new " + typeString + "()"); } else { staticWriter.Write(TypeProcessor.DefaultValue(type)); } staticWriter.Write(";"); staticWriter.WriteLine(); Context.Instance.StaticInits.Add(staticWriter.ToString()); } } writer.Write(";"); writer.WriteLine(); }
public static void Go(OutputWriter writer, InitializerExpressionSyntax initializer) { writer.WriteIndent(); var isCollectionInit = false; if (CSharpExtensions.CSharpKind(initializer) == SyntaxKind.CollectionInitializerExpression || CSharpExtensions.CSharpKind(initializer) == SyntaxKind.ArrayInitializerExpression) { var tx = TypeProcessor.GetTypeInfo(initializer); var t = tx.Type; if (t == null) { t = tx.ConvertedType; } if (t != null) // Initializer within initializer { var elementType = t.As <IArrayTypeSymbol>().ElementType; var ptr = !elementType.IsValueType; // ? "" : ""; var type = TypeProcessor.ConvertType(elementType); var typeString = "Array_T!(" + type + ")"; if (elementType.TypeKind == TypeKind.TypeParameter) { writer.Write(" __TypeNew!(" + typeString + ")("); } else { writer.Write("new " + typeString + "("); } } var variableDeclarationSyntax = initializer.Parent.Parent.Parent as VariableDeclarationSyntax; if (variableDeclarationSyntax != null) { var atype = variableDeclarationSyntax.Type; initializer.WriteArrayInitializer(writer, atype); } else { initializer.WriteArrayInitializer(writer); } if (t != null) { writer.Write(")"); } } else { // writer.Write("goto "); // foreach (var expressionSyntax in method.Expressions) // { // Core.Write(writer, expressionSyntax); // } bool first = true; foreach (var expression in initializer.Expressions) { if (first) { first = false; } else { writer.Write(", "); } Core.Write(writer, expression); } } // writer.Write(";"); }
private static void ProcessArgument(OutputWriter writer, ArgumentSyntax variable, bool isOverloaded = false) { if (variable != null) { if (variable.NameColon != null) { } if (CSharpExtensions.CSharpKind(variable) == SyntaxKind.CollectionInitializerExpression) { return; } var value = variable; var initializerType = TypeProcessor.GetTypeInfo(value.Expression); var memberaccessexpression = value.Expression as MemberAccessExpressionSyntax; var nameexpression = value.Expression as NameSyntax; var nullAssignment = value.ToFullString().Trim() == "null"; var shouldBox = initializerType.Type != null && (initializerType.Type != initializerType.ConvertedType) && ((initializerType.Type.IsValueType || initializerType.Type.TypeKind == TypeKind.TypeParameter) && (!initializerType.ConvertedType.IsValueType)); var shouldCast = initializerType.Type != null && (initializerType.Type.TypeKind == TypeKind.Interface && initializerType.ConvertedType.SpecialType == SpecialType.System_Object); var shouldUnBox = initializerType.Type != null && (initializerType.Type != initializerType.ConvertedType) && !initializerType.Type.IsValueType && initializerType.ConvertedType.IsValueType; var isname = value.Expression is NameSyntax; var ismemberexpression = value.Expression is MemberAccessExpressionSyntax || (isname && TypeProcessor.GetSymbolInfo(value.Expression as NameSyntax).Symbol.Kind == SymbolKind.Method); var isdelegateassignment = ismemberexpression && initializerType.ConvertedType != null && initializerType.ConvertedType.TypeKind == TypeKind.Delegate; var isstaticdelegate = isdelegateassignment && ((memberaccessexpression != null && TypeProcessor.GetSymbolInfo(memberaccessexpression).Symbol.IsStatic) || (isname && TypeProcessor.GetSymbolInfo(nameexpression).Symbol.IsStatic)); if (isOverloaded) { writer.Write("cast(const({0}))", TypeProcessor.ConvertType(initializerType.Type)); } if (shouldCast) { writer.Write("cast(NObject)"); writer.Write("("); Core.Write(writer, value.Expression); writer.Write(")"); return; } if (nullAssignment) { writer.Write("null"); return; } if (shouldBox) { bool useType = true; //We should start with exact converters and then move to more generic convertors i.e. base class or integers which are implicitly convertible var correctConverter = initializerType.Type.GetImplicitCoversionOp(initializerType.ConvertedType, initializerType.Type, true); // initializerType.Type.GetMembers("op_Implicit").OfType<IMethodSymbol>().FirstOrDefault(h => h.ReturnType == initializerType.Type && h.Parameters[0].Type == initializerType.ConvertedType); if (correctConverter == null) { useType = false; correctConverter = initializerType.ConvertedType.GetImplicitCoversionOp(initializerType.ConvertedType, initializerType.Type, true); //.GetMembers("op_Implicit").OfType<IMethodSymbol>().FirstOrDefault(h => h.ReturnType == initializerType.Type && h.Parameters[0].Type == initializerType.ConvertedType); } if (correctConverter != null) { if (useType) { writer.Write(TypeProcessor.ConvertType(initializerType.Type) + "." + "op_Implicit_" + TypeProcessor.ConvertType(correctConverter.ReturnType, false, true, false).Replace(".", "_")); } else { writer.Write(TypeProcessor.ConvertType(initializerType.ConvertedType) + "." + "op_Implicit_" + TypeProcessor.ConvertType(correctConverter.ReturnType, false, true, false).Replace(".", "_")); } writer.Write("("); Core.Write(writer, value.Expression); writer.Write(")"); return; } } else if (shouldUnBox) { bool useType = true; //We should start with exact converters and then move to more generic convertors i.e. base class or integers which are implicitly convertible var correctConverter = initializerType.Type.GetImplicitCoversionOp(initializerType.Type, initializerType.ConvertedType, true); // initializerType.Type.GetMembers("op_Implicit").OfType<IMethodSymbol>().FirstOrDefault(h => h.ReturnType == initializerType.Type && h.Parameters[0].Type == initializerType.ConvertedType); if (correctConverter == null) { useType = false; correctConverter = initializerType.ConvertedType.GetImplicitCoversionOp(initializerType.Type, initializerType.ConvertedType, true); //.GetMembers("op_Implicit").OfType<IMethodSymbol>().FirstOrDefault(h => h.ReturnType == initializerType.Type && h.Parameters[0].Type == initializerType.ConvertedType); } if (correctConverter != null) { if (useType) { writer.Write(TypeProcessor.ConvertType(initializerType.Type) + "." + "op_Implicit_" + TypeProcessor.ConvertType(correctConverter.ReturnType, false, true, false).Replace(".", "_")); } else { writer.Write(TypeProcessor.ConvertType(initializerType.ConvertedType) + "." + "op_Implicit_" + TypeProcessor.ConvertType(correctConverter.ReturnType, false, true, false).Replace(".", "_")); } writer.Write("("); Core.Write(writer, value.Expression); writer.Write(")"); return; } } if (shouldBox) { //Box writer.Write("BOX!(" + TypeProcessor.ConvertType(initializerType.Type) + ")("); //When passing an argument by ref or out, leave off the .Value suffix Core.Write(writer, value.Expression); writer.Write(")"); return; } if (shouldUnBox) { //UnBox writer.Write("Cast!(" + TypeProcessor.ConvertType(initializerType.Type) + ")("); Core.Write(writer, value.Expression); writer.Write(")"); } if (isdelegateassignment) { var typeString = TypeProcessor.ConvertType(initializerType.ConvertedType); var createNew = !(value.Expression is ObjectCreationExpressionSyntax); if (createNew) { if (initializerType.ConvertedType.TypeKind == TypeKind.TypeParameter) { writer.Write(" __TypeNew!(" + typeString + ")("); } else { writer.Write("new " + typeString + "("); } } var isStatic = isstaticdelegate; // if (isStatic) // writer.Write("__ToDelegate("); MemberUtilities.WriteMethodPointer(writer, value.Expression); // if (isStatic) // writer.Write(")"); if (createNew) { writer.Write(")"); } return; } if (initializerType.Type == null && initializerType.ConvertedType == null) { writer.Write("null"); return; } Core.Write(writer, value.Expression); } }
public static void Go(OutputWriter writer, MemberDeclarationSyntax field, SyntaxTokenList modifiers, string name, TypeSyntax type, EqualsValueClauseSyntax initializerOpt = null) { writer.WriteIndent(); var typeinfo = TypeProcessor.GetTypeInfo(type); // var isPtr = typeinfo.Type != null && (typeinfo.Type.IsValueType || typeinfo.Type.TypeKind==TypeKind.TypeParameter) ? "" : ""; var typeStringNoPtr = TypeProcessor.ConvertType(type); var typeString = typeStringNoPtr + " "; var isConst = IsConst(modifiers, initializerOpt, type); var isStatic = isConst; //Handle Auto Properties if (modifiers.Any(SyntaxKind.PrivateKeyword)) { writer.Write("private "); } if (modifiers.Any(SyntaxKind.PublicKeyword) || modifiers.Any(SyntaxKind.InternalKeyword) || modifiers.Any(SyntaxKind.ProtectedKeyword) || modifiers.Any(SyntaxKind.AbstractKeyword)) { writer.Write("public "); } if (modifiers.Any(SyntaxKind.StaticKeyword) || modifiers.Any(SyntaxKind.ConstKeyword)) { isStatic = true; writer.Write("static "); } if (isConst) { writer.Write("const "); // writer.Write("const "); } var @event = field is EventFieldDeclarationSyntax; if (@event) { typeString = ("Event!(" + typeString + ")"); } writer.Write(typeString); // if (isStatic) // writer.Write(typeString); writer.Write(name); if (isStatic) { // var fieldInfo = TypeProcessor.GetDeclaredSymbol(field.Parent); // if (fieldInfo != null) // writer.Write((!string.IsNullOrEmpty(fieldInfo.ContainingNamespace.FullName())?(fieldInfo.ContainingNamespace.FullName()+".") :"") + fieldInfo.Name+"."+name); // writer.Write(name); } if (!isStatic || isConst) { if (initializerOpt != null) { writer.Write(" = "); if (CSharpExtensions.CSharpKind(initializerOpt.Value) == SyntaxKind.CollectionInitializerExpression || CSharpExtensions.CSharpKind(initializerOpt.Value) == SyntaxKind.ArrayInitializerExpression) { // writer.Write("gc::gc_ptr< " + typeStringNoPtr + " >("); writer.Write(" new " + typeString + " ("); var intializer = initializerOpt.Value as InitializerExpressionSyntax; intializer.WriteArrayInitializer(writer, type); writer.Write(")"); } else { Core.Write(writer, initializerOpt.Value); } } else { if (typeinfo.Type.TypeKind != TypeKind.Struct) { writer.Write(" = "); if (typeinfo.Type.TypeKind == TypeKind.Delegate) { writer.Write("new " + typeString + "()"); } else { writer.Write(TypeProcessor.DefaultValue(type)); } } } } else { var staticWriter = new OutputWriter("", "", false); if (initializerOpt != null) { staticWriter.Write(name); staticWriter.Write(" = "); if (CSharpExtensions.CSharpKind(initializerOpt.Value) == SyntaxKind.CollectionInitializerExpression || CSharpExtensions.CSharpKind(initializerOpt.Value) == SyntaxKind.ArrayInitializerExpression) { staticWriter.Write("new " + typeStringNoPtr + " ("); var intializer = initializerOpt.Value as InitializerExpressionSyntax; intializer.WriteArrayInitializer(staticWriter, type); staticWriter.Write(")"); } else { Core.Write(staticWriter, initializerOpt.Value); } // if (CSharpExtensions.CSharpKind(initializerOpt.Value) == SyntaxKind.CollectionInitializerExpression || CSharpExtensions.CSharpKind(initializerOpt.Value) == SyntaxKind.ArrayInitializerExpression) // { // // // staticWriter.Write("])"); // } } else if (typeinfo.Type.TypeKind != TypeKind.Struct) { staticWriter.Write(name); staticWriter.Write(" = "); if (typeinfo.Type.TypeKind == TypeKind.Delegate) { staticWriter.Write("new " + typeString + "()"); } else { staticWriter.Write(TypeProcessor.DefaultValue(type)); } } // staticWriter.Write (" SharpNative"); staticWriter.Write(";"); staticWriter.WriteLine(); Context.Instance.StaticInits.Add(staticWriter.ToString()); } writer.Write(";"); writer.WriteLine(); }