private static bool GenerateInitializerForFieldWithoutInitializer(TypeSyntax parentType) { //Determine if we need to write an initializer for this field which does not have an initializer. if (TypeProcessor.ValueToReference(parentType)) { return(true); } else { return(TypeProcessor.DefaultValue(TypeProcessor.ConvertType(parentType)) != "null"); } }
public static void Go(HaxeWriter writer, SyntaxTokenList modifiers, string name, TypeSyntax type, EqualsValueClauseSyntax initializerOpt = null) { writer.WriteIndent(); var isConst = IsConst(modifiers, initializerOpt, type); WriteFieldModifiers(writer, modifiers); if (isConst) { writer.Write("inline "); } writer.Write("var "); writer.Write(name); writer.Write(TypeProcessor.ConvertTypeWithColon(type)); if (initializerOpt != null) { writer.Write(" = "); Core.Write(writer, initializerOpt.Value); } else if (GenerateInitializerForFieldWithoutInitializer(type)) { writer.Write(" = "); if (TypeProcessor.ValueToReference(type)) { writer.Write("new "); writer.Write(TypeProcessor.ConvertType(type)); writer.Write("()"); } else { writer.Write(TypeProcessor.DefaultValue(TypeProcessor.ConvertType(type))); } } writer.Write(";"); writer.WriteLine(); }
public static void WriteInstanceConstructor(HaxeWriter writer, ConstructorDeclarationSyntax ctorOpt) { writer.WriteIndent(); writer.Write("public function new("); if (ctorOpt != null) { var firstParameter = true; foreach (var parameter in ctorOpt.ParameterList.Parameters) { if (firstParameter) { firstParameter = false; } else { writer.Write(", "); } writer.Write(parameter.Identifier.ValueText); writer.Write(TypeProcessor.ConvertTypeWithColon(parameter.Type)); if (parameter.Default != null) { writer.Write(" = "); Core.Write(writer, parameter.Default.Value); } } } writer.Write(")\r\n"); writer.WriteOpenBrace(); if (!TypeState.Instance.DerivesFromObject) { if (ctorOpt == null || ctorOpt.Initializer == null) { writer.WriteLine("super();"); } else { if (ctorOpt.Initializer.ThisOrBaseKeyword.ToString() != "base") { throw new Exception("Constructor overloading not supported " + Utility.Descriptor(ctorOpt)); } writer.WriteIndent(); writer.Write("super("); bool first = true; foreach (var init in ctorOpt.Initializer.ArgumentList.Arguments) { if (first) { first = false; } else { writer.Write(", "); } Core.Write(writer, init.Expression); } writer.Write(");\r\n"); } } foreach (var field in TypeState.Instance.AllMembers .OfType <BaseFieldDeclarationSyntax>() .Where(o => !o.Modifiers.Any(SyntaxKind.StaticKeyword)) .SelectMany(o => o.Declaration.Variables) .Where(o => (o.Initializer != null && !WriteField.IsConst(o.Parent.Parent.As <BaseFieldDeclarationSyntax>().Modifiers, o.Initializer, o.Parent.As <VariableDeclarationSyntax>().Type)) || (o.Initializer == null && GenerateInitializerForFieldWithoutInitializer(o.Parent.As <VariableDeclarationSyntax>().Type)) || o.Parent.Parent is EventFieldDeclarationSyntax)) { var parentType = field.Parent.As <VariableDeclarationSyntax>().Type; writer.WriteIndent(); writer.Write(field.Identifier.ValueText); writer.Write(" = "); if (field.Parent.Parent is EventFieldDeclarationSyntax) { writer.Write("new CsEvent<"); writer.Write(TypeProcessor.ConvertType(parentType)); writer.Write(">()"); } else if (field.Initializer == null) { if (TypeProcessor.ValueToReference(parentType)) { writer.Write("new "); writer.Write(TypeProcessor.ConvertType(parentType)); writer.Write("()"); } else { writer.Write(TypeProcessor.DefaultValue(TypeProcessor.ConvertType(parentType))); } } else { Core.Write(writer, field.Initializer.Value); } writer.Write(";\r\n"); } if (ctorOpt != null && ctorOpt.Body != null) { foreach (var statement in ctorOpt.Body.As <BlockSyntax>().Statements) { Core.Write(writer, statement); } TriviaProcessor.ProcessTrivias(writer, ctorOpt.Body.DescendantTrivia()); } writer.WriteCloseBrace(); }
public static void WriteStaticConstructor(HaxeWriter writer, ConstructorDeclarationSyntax staticConstructorOpt) { var staticFieldsNeedingInitialization = TypeState.Instance.AllMembers .OfType <BaseFieldDeclarationSyntax>() .Where(o => o.Modifiers.Any(SyntaxKind.StaticKeyword)) .SelectMany(o => o.Declaration.Variables) .Where(o => (o.Initializer != null && !WriteField.IsConst(o.Parent.Parent.As <BaseFieldDeclarationSyntax>().Modifiers, o.Initializer, o.Parent.As <VariableDeclarationSyntax>().Type)) || (o.Initializer == null && GenerateInitializerForFieldWithoutInitializer(o.Parent.As <VariableDeclarationSyntax>().Type)) || o.Parent.Parent is EventFieldDeclarationSyntax) .ToList(); if (staticConstructorOpt == null && staticFieldsNeedingInitialization.Count == 0) { return; //No static constructor needed } writer.WriteLine("public static function cctor():Void"); writer.WriteOpenBrace(); foreach (var field in staticFieldsNeedingInitialization) { var parentType = field.Parent.As <VariableDeclarationSyntax>().Type; writer.WriteIndent(); writer.Write(field.Identifier.ValueText); writer.Write(" = "); if (field.Parent.Parent is EventFieldDeclarationSyntax) { writer.Write("new CsEvent<"); writer.Write(TypeProcessor.ConvertType(parentType)); writer.Write(">()"); } else if (field.Initializer == null) { if (TypeProcessor.ValueToReference(parentType)) { writer.Write("new "); writer.Write(TypeProcessor.ConvertType(parentType)); writer.Write("()"); } else { writer.Write(TypeProcessor.DefaultValue(TypeProcessor.ConvertType(parentType))); } } else { Core.Write(writer, field.Initializer.As <EqualsValueClauseSyntax>().Value); } writer.Write(";\r\n"); } if (staticConstructorOpt != null && staticConstructorOpt.Body != null) { foreach (var statement in staticConstructorOpt.Body.As <BlockSyntax>().Statements) { Core.Write(writer, statement); } } writer.WriteCloseBrace(); StaticConstructors.Add(TypeState.Instance.TypeName); }