internal StructLayoutAttribute(LayoutKind layoutKind, int pack, int size, CharSet charSet) { this._val = layoutKind; this.Pack = pack; this.Size = size; this.CharSet = charSet; }
public StructLayoutAttribute(short layoutKind) { _val = (LayoutKind)layoutKind; }
public StructLayoutAttribute(LayoutKind kind) { _kind = kind; }
/// <summary>Initalizes a new instance of the <see cref="T:System.Runtime.InteropServices.StructLayoutAttribute" /> class with the specified <see cref="T:System.Runtime.InteropServices.LayoutKind" /> enumeration member.</summary> /// <param name="layoutKind">One of the <see cref="T:System.Runtime.InteropServices.LayoutKind" /> values that specifes how the class or structure should be arranged. </param> public StructLayoutAttribute(LayoutKind layoutKind) { this.lkind = layoutKind; }
public StructLayoutAttribute(LayoutKind layoutKind) { _val = layoutKind; }
public static CustomAttributeBuilder GetBuilderForStructLayout(LayoutKind layoutKind) { ConstructorInfo ctorStructLayout = typeof(StructLayoutAttribute).GetConstructor(new Type[] { typeof(LayoutKind) }); return new CustomAttributeBuilder(ctorStructLayout, new Object[] { layoutKind }); }
private static async Task <Document> Refactor(Document document, SyntaxNode nodeToFix, LayoutKind layoutKind, CancellationToken cancellationToken) { var editor = await DocumentEditor.CreateAsync(document, cancellationToken).ConfigureAwait(false); var generator = editor.Generator; var semanticModel = editor.SemanticModel; var structLayoutAttribute = semanticModel.Compilation.GetTypeByMetadataName("System.Runtime.InteropServices.StructLayoutAttribute"); var layoutKindEnum = semanticModel.Compilation.GetTypeByMetadataName("System.Runtime.InteropServices.LayoutKind"); var attribute = editor.Generator.Attribute( generator.TypeExpression(structLayoutAttribute, addImport: true), new[] { generator.AttributeArgument( generator.MemberAccessExpression( generator.TypeExpression(layoutKindEnum, addImport: true), layoutKind.ToString())), }); var structNode = (StructDeclarationSyntax)nodeToFix; editor.AddAttribute(structNode, attribute); return(editor.GetChangedDocument()); }
public void Ctor_LayoutKind(LayoutKind layoutKind) { var attribute = new StructLayoutAttribute(layoutKind); Assert.Equal(layoutKind, attribute.Value); }
public StructLayoutAttribute(LayoutKind layoutKind) { }
public StructLayoutAttribute(short kind) { this.kind = (LayoutKind) kind; }
public static IEnumerable <DependencyProperty> GetLayoutProperties(LayoutKind layoutKind) { return(BaseLayout.GetLayoutProperties(GetLayoutType(layoutKind))); }
public void funcWithDefaultEnumValue(int a, LayoutKind b = LayoutKind.Explicit) { }
public static CustomAttributeBuilder GetBuilderForStructLayout(LayoutKind layoutKind) { ConstructorInfo ctorStructLayout = typeof(StructLayoutAttribute).GetConstructor(new Type[] { typeof(LayoutKind) }); return(new CustomAttributeBuilder(ctorStructLayout, new Object[] { layoutKind })); }
private static IEnumerable <MemberDeclarationSyntax> WriteFields(List <MemberDeclarationSyntax> membersToWrite, Context.SyntaxAndSymbol first, OutputWriter writer) { var fields = membersToWrite.OfType <FieldDeclarationSyntax>().ToList(); var nonFields = membersToWrite.Except(fields); // also static fields should be separately dealt with //Not needed anymore ... reflection takes care of this //if (fields.Count > 0 && fields.Any(j => j.GetModifiers().Any(SyntaxKind.ConstKeyword) || // j.GetModifiers().Any(SyntaxKind.StaticKeyword))) //{ // writer.WriteLine("enum __staticFieldTuple = __Tuple!(" + // fields.Where( // j => // j.GetModifiers().Any(SyntaxKind.ConstKeyword) || // j.GetModifiers().Any(SyntaxKind.StaticKeyword)) // .Select( // k => // "\"" + // WriteIdentifierName.TransformIdentifier( // k.Declaration.Variables[0].Identifier.ValueText) + "\"") // .Aggregate((i, j) => i + "," + j) + ");//Reflection Support"); //} var structLayout = first.Syntax.GetAttribute(Context.StructLayout); if (structLayout != null) { LayoutKind value = LayoutKind.Auto; if ( structLayout.ArgumentList.Arguments.Any( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "Value")) { value = (LayoutKind) Enum.Parse(typeof(LayoutKind), structLayout.ArgumentList.Arguments.FirstOrDefault( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "Value") .Expression.ToFullString() .SubstringAfterLast('.')); } else if (structLayout.ArgumentList.Arguments.Count > 0 && structLayout.ArgumentList.Arguments[0].NameEquals == null) { value = (LayoutKind) Enum.Parse(typeof(LayoutKind), structLayout.ArgumentList.Arguments[0].Expression.ToFullString() .SubstringAfterLast('.')); } int pack = -1; int size = -1; CharSet charset = CharSet.Auto; // if (structLayout.ArgumentList.Arguments.Count > 1) { try { if ( structLayout.ArgumentList.Arguments.Any( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "CharSet")) { charset = (CharSet) Enum.Parse(typeof(CharSet), structLayout.ArgumentList.Arguments.FirstOrDefault( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "CharSet") .Expression.ToFullString() .SubstringAfterLast('.')); //structLayout.ArgumentList.Arguments.Where (k => k.Expression is MemberAccessExpressionSyntax).FirstOrDefault(k=>(k.Expression as MemberAccessExpressionSyntax).Name.ToFullString() == "Value"); } //structLayout.ArgumentList.Arguments.Where (k => k.Expression is MemberAccessExpressionSyntax).FirstOrDefault(k=>(k.Expression as MemberAccessExpressionSyntax).Name.ToFullString() == "Value"); else if (structLayout.ArgumentList.Arguments.Count > 1 && structLayout.ArgumentList.Arguments[1].NameEquals == null) { charset = (CharSet) Enum.Parse(typeof(CharSet), structLayout.ArgumentList.Arguments[1].Expression.ToFullString() .SubstringAfterLast('.')); } } catch (Exception ex) { } try { if ( structLayout.ArgumentList.Arguments.Any( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "Pack")) { pack = int.Parse( structLayout.ArgumentList.Arguments.FirstOrDefault( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "Pack") .Expression.ToFullString()); } //structLayout.ArgumentList.Arguments.Where (k => k.Expression is MemberAccessExpressionSyntax).FirstOrDefault(k=>(k.Expression as MemberAccessExpressionSyntax).Name.ToFullString() == "Value"); else if (structLayout.ArgumentList.Arguments.Count > 2 && structLayout.ArgumentList.Arguments[2].NameEquals == null) { pack = int.Parse(structLayout.ArgumentList.Arguments[2].Expression.ToFullString()); } } catch (Exception ex) { } try { if ( structLayout.ArgumentList.Arguments.Any( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "Size")) { size = int.Parse( structLayout.ArgumentList.Arguments.FirstOrDefault( k => k.NameColon != null && k.NameColon.ToFullString().Trim() == "Size") .Expression.ToFullString()); } //structLayout.ArgumentList.Arguments.Where (k => k.Expression is MemberAccessExpressionSyntax).FirstOrDefault(k=>(k.Expression as MemberAccessExpressionSyntax).Name.ToFullString() == "Value"); else if (structLayout.ArgumentList.Arguments.Count > 3 && structLayout.ArgumentList.Arguments[3].NameEquals == null) { size = int.Parse(structLayout.ArgumentList.Arguments[3].Expression.ToFullString()); } } catch (Exception ex) { } // size = int.Parse (structLayout.ArgumentList.Arguments [3].Expression.ToFullString ()); } // var pack = structLayout.ArgumentList.Arguments.FirstOrDefault (k => k.NameColon.Name.ToFullString() == "Pack"); // var charset = structLayout.ArgumentList.Arguments.FirstOrDefault (k => k.NameColon.Name.ToFullString() == "CharSet"); // var size = structLayout.ArgumentList.Arguments.FirstOrDefault (k => k.NameColon.Name.ToFullString() == "Size"); if (value == LayoutKind.Explicit) { var fieldGroups = fields.GroupBy(f => f.GetAttribute(Context.FieldOffset).ArgumentList.Arguments[0].ToString()) .OrderBy(k => k.Key); writer.Indent++; foreach (var group in fieldGroups) { writer.WriteLine("//FieldOffset(" + @group.Key + ")"); writer.WriteLine("union {"); foreach (var member in @group) { Core.Write(writer, member); } writer.WriteLine("}"); } // foreach (var member in fields) // { // // writer.WriteLine(); // Core.Write (writer, member); // } } else if (value == LayoutKind.Sequential) { fields = SortFields(fields); writer.Indent++; foreach (var member in fields) { if (pack != -1) { writer.WriteLine("align (" + pack + "): //Pack = " + pack); } // writer.WriteLine(); Core.Write(writer, member); } } else { //Looks like C# aligns to 1 by default ... don't know about D... fields = SortFields(fields); writer.Indent++; foreach (var member in fields) { pack = 1; //TODO: on mac osx and mono this is required, on windows, it causes and issue // writer.WriteLine("align (" + pack + "): //Pack = " + pack + " C# default"); // writer.WriteLine(); Core.Write(writer, member); } } } else { //Looks like C# aligns to 1 by default ... don't know about D... fields = SortFields(fields); writer.Indent++; foreach (var member in fields) { var pack = 1; //TODO: on mac osx and mono this is required, on windows, it causes an issue (sizes are different) // writer.WriteLine("align (" + pack + "): //Pack = " + pack + "C# default"); // writer.WriteLine(); Core.Write(writer, member); } } return(nonFields); }
public StructLayoutAttribute( short layoutKind) { lkind = (LayoutKind)layoutKind; }
public static void ValidateAttribute(StructLayoutAttribute atrib, LayoutKind kind, CharSet charset, int pack) { Assert.Equal(atrib.Value, kind); Assert.Equal(atrib.CharSet, charset); Assert.Equal(atrib.Pack, pack); }
public CSharpStructLayoutAttribute(LayoutKind layoutKind) { LayoutKind = layoutKind; }
internal static void DecodeStructLayoutAttribute <TTypeWellKnownAttributeData, TAttributeSyntaxNode, TAttributeData, TAttributeLocation>( ref DecodeWellKnownAttributeArguments <TAttributeSyntaxNode, TAttributeData, TAttributeLocation> arguments, CharSet defaultCharSet, int defaultAutoLayoutSize, CommonMessageProvider messageProvider) where TTypeWellKnownAttributeData : CommonTypeWellKnownAttributeData, new() where TAttributeSyntaxNode : SyntaxNode where TAttributeData : AttributeData { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; CharSet charSet = (defaultCharSet != Cci.Constants.CharSet_None) ? defaultCharSet : CharSet.Ansi; int? size = null; int? alignment = null; bool hasErrors = false; LayoutKind kind = attribute.CommonConstructorArguments[0].DecodeValue <LayoutKind>(Microsoft.CodeAnalysis.SpecialType.System_Enum); switch (kind) { case LayoutKind.Auto: case LayoutKind.Explicit: case LayoutKind.Sequential: break; default: messageProvider.ReportInvalidAttributeArgument(arguments.Diagnostics, arguments.AttributeSyntaxOpt, 0, attribute); hasErrors = true; break; } int position = 1; foreach (var namedArg in attribute.CommonNamedArguments) { switch (namedArg.Key) { case "CharSet": charSet = namedArg.Value.DecodeValue <CharSet>(SpecialType.System_Enum); switch (charSet) { case Cci.Constants.CharSet_None: charSet = CharSet.Ansi; break; case CharSet.Ansi: case Cci.Constants.CharSet_Auto: case CharSet.Unicode: break; default: messageProvider.ReportInvalidNamedArgument(arguments.Diagnostics, arguments.AttributeSyntaxOpt, position, attribute.AttributeClass, namedArg.Key); hasErrors = true; break; } break; case "Pack": alignment = namedArg.Value.DecodeValue <int>(SpecialType.System_Int32); // only powers of 2 less or equal to 128 are allowed: if (alignment > 128 || (alignment & (alignment - 1)) != 0) { messageProvider.ReportInvalidNamedArgument(arguments.Diagnostics, arguments.AttributeSyntaxOpt, position, attribute.AttributeClass, namedArg.Key); hasErrors = true; } break; case "Size": size = namedArg.Value.DecodeValue <int>(Microsoft.CodeAnalysis.SpecialType.System_Int32); if (size < 0) { messageProvider.ReportInvalidNamedArgument(arguments.Diagnostics, arguments.AttributeSyntaxOpt, position, attribute.AttributeClass, namedArg.Key); hasErrors = true; } break; } position++; } if (!hasErrors) { if (kind == LayoutKind.Auto && size == null && alignment != null) { // If size is unspecified // C# emits size=0 // VB emits size=1 if the type is a struct, auto-layout and has alignment specified; 0 otherwise size = defaultAutoLayoutSize; } arguments.GetOrCreateData <TTypeWellKnownAttributeData>().SetStructLayout(new TypeLayout(kind, size ?? 0, (byte)(alignment ?? 0)), charSet); } }
public LayoutCallbackCounter SetKind(LayoutKind kind) { _kind = kind; return(this); }
public static CustomAttributeBuilder GetBuilderForStructLayout(LayoutKind layoutKind, int pack, int size) { ConstructorInfo ctorStructLayout = typeof(StructLayoutAttribute).GetConstructor(new Type[] { typeof(LayoutKind) }); FieldInfo fieldPack = typeof(StructLayoutAttribute).GetField("Pack"); FieldInfo fieldSize = typeof(StructLayoutAttribute).GetField("Size"); return new CustomAttributeBuilder( ctorStructLayout, new Object[] { layoutKind }, new FieldInfo[] { fieldPack, fieldSize }, new Object[] { pack, size }); }
public LayoutCallbackCounter(LayoutKind kind) { _kind = kind; }
public StructLayoutAttribute(LayoutKind pValue) { mValue = pValue; }
/// <summary>Initalizes a new instance of the <see cref="T:System.Runtime.InteropServices.StructLayoutAttribute" /> class with the specified <see cref="T:System.Runtime.InteropServices.LayoutKind" /> enumeration member.</summary> /// <param name="layoutKind">One of the <see cref="T:System.Runtime.InteropServices.LayoutKind" /> values that specifes how the class or structure should be arranged. </param> public StructLayoutAttribute(short layoutKind) { this.lkind = (LayoutKind)layoutKind; }
public IEnumerable <IAttribute> GetAttributes() { var b = new AttributeListBuilder(module); var metadata = module.metadata; var typeDefinition = metadata.GetTypeDefinition(handle); // SerializableAttribute if ((typeDefinition.Attributes & TypeAttributes.Serializable) != 0) { b.Add(KnownAttribute.Serializable); } // ComImportAttribute if ((typeDefinition.Attributes & TypeAttributes.Import) != 0) { b.Add(KnownAttribute.ComImport); } #region StructLayoutAttribute LayoutKind layoutKind = LayoutKind.Auto; switch (typeDefinition.Attributes & TypeAttributes.LayoutMask) { case TypeAttributes.SequentialLayout: layoutKind = LayoutKind.Sequential; break; case TypeAttributes.ExplicitLayout: layoutKind = LayoutKind.Explicit; break; } CharSet charSet = CharSet.None; switch (typeDefinition.Attributes & TypeAttributes.StringFormatMask) { case TypeAttributes.AnsiClass: charSet = CharSet.Ansi; break; case TypeAttributes.AutoClass: charSet = CharSet.Auto; break; case TypeAttributes.UnicodeClass: charSet = CharSet.Unicode; break; } var layout = typeDefinition.GetLayout(); LayoutKind defaultLayoutKind = Kind == TypeKind.Struct ? LayoutKind.Sequential : LayoutKind.Auto; if (layoutKind != defaultLayoutKind || charSet != CharSet.Ansi || layout.PackingSize > 0 || layout.Size > 0) { var structLayout = new AttributeBuilder(module, KnownAttribute.StructLayout); structLayout.AddFixedArg( new TopLevelTypeName("System.Runtime.InteropServices", "LayoutKind"), (int)layoutKind); if (charSet != CharSet.Ansi) { var charSetType = Compilation.FindType(new TopLevelTypeName("System.Runtime.InteropServices", "CharSet")); structLayout.AddNamedArg("CharSet", charSetType, (int)charSet); } if (layout.PackingSize > 0) { structLayout.AddNamedArg("Pack", KnownTypeCode.Int32, (int)layout.PackingSize); } if (layout.Size > 0) { structLayout.AddNamedArg("Size", KnownTypeCode.Int32, (int)layout.Size); } b.Add(structLayout.Build()); } #endregion b.Add(typeDefinition.GetCustomAttributes()); b.AddSecurityAttributes(typeDefinition.GetDeclarativeSecurityAttributes()); return(b.Build()); }
public StructLayoutAttribute(LayoutKind layoutKind) { Value = layoutKind; }
internal StructLayoutAttribute(LayoutKind layoutKind, int pack, int size, CharSet charSet) { _val = layoutKind; Pack = pack; Size = size; CharSet = charSet; }
public StructLayoutAttribute( LayoutKind layoutKind) { lkind = layoutKind; }
public static void Go() { var partials = Context.Instance.Partials; var first = partials.First(); Context.Instance.Namespace = first.Symbol.ContainingNamespace.FullName(); Context.Instance.Type = first.Symbol; TypeProcessor.ClearUsedTypes(); var mynamespace = Context.Instance.Type.ContainingNamespace.FullName().RemoveFromEndOfString(".Namespace"); // + "." + TypeState.Instance.TypeName; Console.WriteLine("Writing out type: " + Context.Instance.Namespace + "." + Context.Instance.TypeName); if ((Context.Instance.Namespace + "." + Context.Instance.TypeName) == "Mono.Security.X509.Namespace.X509Chain") { } var myUsingDirective = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(mynamespace)); var SystemUsingDirective = SyntaxFactory.UsingDirective(SyntaxFactory.ParseName("System")); // Required as certain functions like boxing are in this namespace var namespaces = first.Syntax.Parent.DescendantNodes().OfType <UsingDirectiveSyntax>().ToArray(); var usingStatements = first.Syntax.Parent.DescendantNodes().OfType <UsingStatementSyntax>().ToArray(); Context.Instance.UsingDeclarations = namespaces .Union(new[] { myUsingDirective, SystemUsingDirective }).ToArray(); var objectType = TypeProcessor.GetSemanticModel(partials.First().Syntax) .Compilation.GetTypeByMetadataName("System.Object"); using (var writer = new OutputWriter(Context.Instance.Namespace, Context.Instance.TypeName)) { var bases = partials .Select(o => o.Syntax.BaseList) .Where(o => o != null) .SelectMany(o => o.Types) .Select(o => TypeProcessor.GetTypeInfo(o.Type).ConvertedType) .Distinct() .ToList(); // var interfaces = bases.Where(o => o.TypeKind == TypeKind.Interface).ToList(); if (!bases.Any((j => j.TypeKind != TypeKind.Interface)) && !(first.Symbol.TypeKind == TypeKind.Interface || first.Symbol.TypeKind == TypeKind.Struct)) { //TODO: fix structs using mixins / alias this bases.Add(objectType); } // WriteStandardIncludes.Go(writer); // writer.WriteLine(String.Format("#include \"{0}\"", TypeState.Instance.TypeName + ".h")); WriteBcl.Go(writer); //TypeState.Instance.DerivesFromObject = bases.Count == interfaces.Count; var @namespace = first.Symbol.ContainingNamespace.FullName(); //Module name = namespace + "." + typename; WriteStandardIncludes.Go(writer); // var namespaces = @namespace.Split(new string[] { "." }, StringSplitOptions.None); // // if (@namespace.Length > 0) // { // foreach (var ns in namespaces) // { // writer.WriteLine("namespace " + ns + "\r\n{"); // writer.WriteLine("namespace " + ns + "\r\n{"); // } // // } //TODO: Fix enum support if (first.Syntax is EnumDeclarationSyntax) { WriteEnum.Go(writer, Context.Instance.Partials.Select(o => o.Syntax) .Cast <EnumDeclarationSyntax>() .SelectMany(o => o.Members) .Where(o => !Program.DoNotWrite.ContainsKey(o))); return; } Context.Instance.AllMembers = partials.Select(o => o.Syntax) .Cast <TypeDeclarationSyntax>() .SelectMany(o => o.Members) .Where(o => !Program.DoNotWrite.ContainsKey(o)) .ToList(); var allMembersToWrite = Context.Instance.AllMembers .Where(member => !(member is TypeDeclarationSyntax) && !(member is EnumDeclarationSyntax) && !(member is DelegateDeclarationSyntax) && !(member is ConstructorDeclarationSyntax)) .ToList(); var instanceCtors = Context.Instance.AllMembers.OfType <ConstructorDeclarationSyntax>() .Where(o => !o.Modifiers.Any(SyntaxKind.StaticKeyword)) .ToList(); var staticCtors = Context.Instance.AllMembers.OfType <ConstructorDeclarationSyntax>() .Where(o => (o.Modifiers.Any(SyntaxKind.StaticKeyword))) .ToList(); //TODO: Add support for overloading constructing // if (instanceCtors.Count > 1) // throw new Exception( // "Overloaded constructors are not supported. Consider changing all but one to static Create methods " + // Utility.Descriptor(first.Syntax)); // var ctorOpt = instanceCtors.SingleOrDefault(); //TODO: Handle interfaces by /* * class Interface * { * public: * virtual ~Interface() { } * virtual void test() = 0; // Functions, must all be virtual * } */ var membersToWrite = allMembersToWrite.ToList(); //.Where(o => IsStatic(o) == staticMembers).ToList(); // if (membersToWrite.Count == 0 && (partials.Any(o => o.Syntax.Modifiers.Any(SyntaxKind.StaticKeyword)))) // continue; // if (staticMembers) // writer.Write("object "); // else if (first.Syntax.Kind == SyntaxKind.InterfaceDeclaration) // writer.Write("trait "); // else // { // if (partials.Any(o => o.Syntax.Modifiers.Any(SyntaxKind.AbstractKeyword))) // writer.Write("abstract "); // } // writer.Write(TypeState.Instance.TypeName); if (first.Syntax is TypeDeclarationSyntax) { //Look for generic arguments var genericArgs = partials .Select(o => o.Syntax) .Cast <TypeDeclarationSyntax>() .Where(o => o.TypeParameterList != null) .SelectMany(o => o.TypeParameterList.Parameters) .ToList(); if (Context.Instance.Type.TypeKind == TypeKind.Class) { writer.Write("class "); } else if (Context.Instance.Type.TypeKind == TypeKind.Interface) { writer.Write("interface "); } else if (Context.Instance.Type.TypeKind == TypeKind.Struct) { writer.Write("struct "); // writer.Write (" class "); // Allows inheritance ... but too many issues, will look at this when it gets relevant } else { throw new Exception("don't know how to write type: " + Context.Instance.Type.TypeKind); } //writer.Write (((TypeState.Instance.Type.TypeKind== TypeKind.Interface)?" interface ": ) ); writer.Write(Context.Instance.TypeName); if (genericArgs.Count > 0) { writer.Write("( "); writer.Write(string.Join(" , ", genericArgs.Select(o => o))); writer.Write(" )"); } bool firstBase = true; if (Context.Instance.Type.TypeKind != TypeKind.Struct) { foreach (var baseType in bases.OrderBy(o => o.TypeKind == TypeKind.Interface ? 1 : 0)) { writer.Write(firstBase ? " : " : " ,"); writer.Write(TypeProcessor.ConvertType(baseType)); // if (firstBase && ctorOpt != null && ctorOpt.Initializer != null && // ctorOpt.Initializer.ArgumentList.Arguments.Count > 0) // { // writer.Write("("); // bool firstArg = true; // foreach (var init in ctorOpt.Initializer.ArgumentList.Arguments) // { // if (firstArg) // firstArg = false; // else // writer.Write(", "); // // Core.Write(writer, init.Expression); // } // writer.Write(")"); // } firstBase = false; } } } writer.WriteLine(); writer.OpenBrace(); var fields = membersToWrite.OfType <FieldDeclarationSyntax>().ToList(); var nonFields = membersToWrite.Except(fields); // also static fields should be separately dealt with var structLayout = first.Syntax.GetAttribute(Context.StructLayout); if (structLayout != null) { LayoutKind value = LayoutKind.Auto; if ( structLayout.ArgumentList.Arguments.Any( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "Value")) { value = (LayoutKind) Enum.Parse(typeof(LayoutKind), structLayout.ArgumentList.Arguments.FirstOrDefault( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "Value") .Expression.ToFullString() .SubstringAfterLast('.')); //structLayout.ArgumentList.Arguments.Where (k => k.Expression is MemberAccessExpressionSyntax).FirstOrDefault(k=>(k.Expression as MemberAccessExpressionSyntax).Name.ToFullString() == "Value"); } //structLayout.ArgumentList.Arguments.Where (k => k.Expression is MemberAccessExpressionSyntax).FirstOrDefault(k=>(k.Expression as MemberAccessExpressionSyntax).Name.ToFullString() == "Value"); else if (structLayout.ArgumentList.Arguments.Count > 0 && structLayout.ArgumentList.Arguments[0].NameEquals == null) { value = (LayoutKind) Enum.Parse(typeof(LayoutKind), structLayout.ArgumentList.Arguments[0].Expression.ToFullString() .SubstringAfterLast('.')); } int pack = -1; int size = -1; CharSet charset = CharSet.Auto; // if (structLayout.ArgumentList.Arguments.Count > 1) { try { if ( structLayout.ArgumentList.Arguments.Any( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "CharSet")) { charset = (CharSet) Enum.Parse(typeof(CharSet), structLayout.ArgumentList.Arguments.FirstOrDefault( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "CharSet") .Expression.ToFullString() .SubstringAfterLast('.')); //structLayout.ArgumentList.Arguments.Where (k => k.Expression is MemberAccessExpressionSyntax).FirstOrDefault(k=>(k.Expression as MemberAccessExpressionSyntax).Name.ToFullString() == "Value"); } //structLayout.ArgumentList.Arguments.Where (k => k.Expression is MemberAccessExpressionSyntax).FirstOrDefault(k=>(k.Expression as MemberAccessExpressionSyntax).Name.ToFullString() == "Value"); else if (structLayout.ArgumentList.Arguments.Count > 1 && structLayout.ArgumentList.Arguments[1].NameEquals == null) { charset = (CharSet) Enum.Parse(typeof(CharSet), structLayout.ArgumentList.Arguments[1].Expression.ToFullString() .SubstringAfterLast('.')); } } catch (Exception ex) { } try { if ( structLayout.ArgumentList.Arguments.Any( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "Pack")) { pack = int.Parse( structLayout.ArgumentList.Arguments.FirstOrDefault( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "Pack") .Expression.ToFullString()); } //structLayout.ArgumentList.Arguments.Where (k => k.Expression is MemberAccessExpressionSyntax).FirstOrDefault(k=>(k.Expression as MemberAccessExpressionSyntax).Name.ToFullString() == "Value"); else if (structLayout.ArgumentList.Arguments.Count > 2 && structLayout.ArgumentList.Arguments[2].NameEquals == null) { pack = int.Parse(structLayout.ArgumentList.Arguments[2].Expression.ToFullString()); } } catch (Exception ex) { } try { if ( structLayout.ArgumentList.Arguments.Any( k => k.NameEquals != null && k.NameEquals.Name.ToFullString().Trim() == "Size")) { size = int.Parse( structLayout.ArgumentList.Arguments.FirstOrDefault( k => k.NameColon != null && k.NameColon.ToFullString().Trim() == "Size") .Expression.ToFullString()); } //structLayout.ArgumentList.Arguments.Where (k => k.Expression is MemberAccessExpressionSyntax).FirstOrDefault(k=>(k.Expression as MemberAccessExpressionSyntax).Name.ToFullString() == "Value"); else if (structLayout.ArgumentList.Arguments.Count > 3 && structLayout.ArgumentList.Arguments[3].NameEquals == null) { size = int.Parse(structLayout.ArgumentList.Arguments[3].Expression.ToFullString()); } } catch (Exception ex) { } // size = int.Parse (structLayout.ArgumentList.Arguments [3].Expression.ToFullString ()); } // var pack = structLayout.ArgumentList.Arguments.FirstOrDefault (k => k.NameColon.Name.ToFullString() == "Pack"); // var charset = structLayout.ArgumentList.Arguments.FirstOrDefault (k => k.NameColon.Name.ToFullString() == "CharSet"); // var size = structLayout.ArgumentList.Arguments.FirstOrDefault (k => k.NameColon.Name.ToFullString() == "Size"); if (value == LayoutKind.Explicit) { var fieldGroups = fields.GroupBy(f => f.GetAttribute(Context.FieldOffset).ArgumentList.Arguments[0].ToString()) .OrderBy(k => k.Key); writer.Indent++; foreach (var group in fieldGroups) { writer.WriteLine("//FieldOffset(" + @group.Key + ")"); writer.WriteLine("union {"); foreach (var member in group) { Core.Write(writer, member); } writer.WriteLine("}"); } // foreach (var member in fields) // { // // writer.WriteLine(); // Core.Write (writer, member); // } } else if (value == LayoutKind.Sequential) { fields = SortFields(fields); writer.Indent++; foreach (var member in fields) { if (pack != -1) { writer.WriteLine("align (" + pack + "): //Pack = " + pack); } // writer.WriteLine(); Core.Write(writer, member); } } else { //Looks like C# aligns to 1 by default ... don't know about D... fields = SortFields(fields); writer.Indent++; foreach (var member in fields) { pack = 1; writer.WriteLine("align (" + pack + "): //Pack = " + pack + "C# default"); // writer.WriteLine(); Core.Write(writer, member); } } } else { //Looks like C# aligns to 1 by default ... don't know about D... fields = SortFields(fields); writer.Indent++; foreach (var member in fields) { var pack = 1; writer.WriteLine("align (" + pack + "): //Pack = " + pack + "C# default"); // writer.WriteLine(); Core.Write(writer, member); } } foreach (var member in nonFields) { // writer.WriteLine(); Core.Write(writer, member); } foreach (var constructor in instanceCtors) { // writer.WriteLine(); Core.Write(writer, constructor); } if (staticCtors.Count == 0) { if (Context.Instance.StaticInits.Count > 0) { var constructor = SyntaxFactory.ConstructorDeclaration(Context.Instance.TypeName); constructor = constructor.WithModifiers( SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.StaticKeyword))); WriteConstructorBody.WriteStaticConstructor(writer, constructor, Context.Instance.StaticInits); staticCtors.Add(constructor); } } else { var isFirst = true; foreach (ConstructorDeclarationSyntax constructor in staticCtors) { if (isFirst) { WriteConstructorBody.WriteStaticConstructor(writer, constructor, Context.Instance.StaticInits); } else { WriteConstructorBody.Go(writer, constructor); } isFirst = false; } } var dllImports = Context.Instance.DllImports; // This should only be written once ... I guess we have to put the detection logic in Program.cs if (Context.Instance.EntryMethod != null) { if (dllImports.Count > 0) { writer.WriteLine(); writer.WriteLine(String.Format("static void * __DllImportMap[{0}];", dllImports.Count)); writer.WriteLine("static void __SetupDllImports()"); writer.OpenBrace(); for (int index = 0; index < dllImports.Count; index++) { var dllImport = dllImports[index]; writer.WriteLine(String.Format("__DllImportMap[{0}] = LoadNativeLibrary(cast(string){1});", index, dllImport.ArgumentList.Arguments.FirstOrDefault(k => k.Expression != null))); } writer.CloseBrace(); writer.WriteLine(); writer.WriteLine("static void __FreeDllImports()"); writer.OpenBrace(); writer.WriteLine(String.Format(@"for(int i=0;i<{0};i++)", dllImports.Count)); writer.OpenBrace(); writer.WriteLine("if(__DllImportMap[i]!=null)"); writer.WriteLine("\tFreeNativeLibrary(__DllImportMap[i]);"); writer.CloseBrace(); writer.CloseBrace(); // if (hModule != null) // { // ::FreeLibrary(hModule); // } } } writer.Indent--; writer.CloseBrace(); //Implement Boxed!Interface if (Context.Instance.Type.TypeKind == TypeKind.Struct) { writer.WriteLine(); var typeName = Context.Instance.TypeName; writer.Write("public class __Boxed_" + typeName + " : Boxed!(" + typeName + ")"); foreach (var baseType in bases.OrderBy(o => o.TypeKind == TypeKind.Interface ? 1 : 0)) { writer.Write(" ,"); writer.Write(TypeProcessor.ConvertType(baseType, false)); } writer.OpenBrace(); //FIXME:This is giving issues, we will just generate them here // writer.WriteLine ("import Irio.Utilities;"); writer.WriteLine("import std.traits;"); foreach (var baseType in bases.Where(o => o.TypeKind == TypeKind.Interface)) { //FIXME:This is giving issues, we will just generate them here // writer.WriteLine ("mixin(__ImplementInterface!({0}, Value));",TypeProcessor.ConvertType(baseType,false)); var ifacemembers = baseType.GetMembers(); foreach (var member in ifacemembers) { var ifacemethod = Context.Instance.Type.FindImplementationForInterfaceMember(member) .DeclaringSyntaxReferences.First() .GetSyntax(); // .Where(member => !(member is TypeDeclarationSyntax) // && !(member is EnumDeclarationSyntax) // && !(member is DelegateDeclarationSyntax) && !(member is ConstructorDeclarationSyntax)) // .ToList(); // writer.WriteLine(); // Core.Write(writer, member); if (ifacemethod is MethodDeclarationSyntax) { WriteMethod.WriteIt(writer, (MethodDeclarationSyntax)ifacemethod); } else if (ifacemethod is PropertyDeclarationSyntax) { WriteProperty.Go(writer, (PropertyDeclarationSyntax)ifacemethod, true); } } } //This is required to be able to create an instance at runtime / reflection // this() // { // super(SimpleStruct.init); // } writer.WriteLine(); writer.WriteLine("this()"); writer.OpenBrace(); writer.WriteLine("super({0}.init);", typeName); writer.CloseBrace(); if (Context.Instance.Type.GetMembers("ToString").Count() >= 1) // Use better matching ? { // writer.WriteLine (); writer.WriteLine("override String ToString()"); writer.OpenBrace(); writer.WriteLine("return Value.ToString();"); writer.CloseBrace(); } writer.WriteLine(); writer.WriteLine("this(ref " + typeName + " value)"); writer.OpenBrace(); writer.WriteLine("super(value);"); writer.CloseBrace(); writer.WriteLine(); writer.WriteLine("U opCast(U)()"); writer.WriteLine("if(is(U:{0}))", typeName); writer.OpenBrace(); writer.WriteLine("return Value;"); writer.CloseBrace(); writer.WriteLine(); writer.WriteLine("U opCast(U)()"); writer.WriteLine("if(!is(U:{0}))", typeName); writer.OpenBrace(); writer.WriteLine("return this;"); writer.CloseBrace(); writer.WriteLine(); writer.WriteLine("auto opDispatch(string op, Args...)(Args args)"); writer.OpenBrace(); writer.WriteLine("enum name = op;"); writer.WriteLine("return __traits(getMember, Value, name)(args);"); writer.CloseBrace(); writer.CloseBrace(); } if (Context.Instance.EntryMethod != null) { //TODO: DllImports should be centralized // writer.WriteLine(); writer.WriteLine("void main(string[] args)"); writer.OpenBrace(); if (dllImports.Count > 0) { writer.WriteLine(Context.Instance.TypeName + ".__SetupDllImports();"); } writer.WriteLine(Context.Instance.EntryMethod); if (dllImports.Count > 0) { writer.WriteLine(Context.Instance.TypeName + ".__FreeDllImports();"); } writer.CloseBrace(); } // var mySpecializations = Program.AllGenericSpecializations.Where (t => t.OriginalDefinition == TypeState.Instance.Type); // // // foreach (var specialization in mySpecializations) { // // var specializationText = ("template class " + specialization.GetFullNameD (false) + " (" + // (string.Join (" , ", // specialization.TypeArguments.Select ( // o => // TypeProcessor.ConvertType (o) + // ((o.IsValueType || // o.TypeKind == TypeKind.TypeParameter) // ? "" // : "*"))) + // ");")); // writer.Write (specializationText); // } // if (@namespace.Length > 0) // { // foreach (var ns in namespaces) // { // writer.WriteLine("\n\n}"); // writer.WriteLine("\n\n}"); // } // } } }