public static void WriteBundlerSourceCode( CodeTextStorage storage, PreparedInformations prepared, string assemblyName) { using (var twSource = storage.CreateSourceCodeWriter(assemblyName + "_bundle")) { var assemblyMangledName = Utilities.GetMangledName(assemblyName); twSource.WriteLine( "// [15-3] This is {0} native code translated by IL2C, do not edit.", assemblyName); twSource.SplitLine(); twSource.WriteLine( "// This is the bundler source code for {0},", assemblyName); twSource.WriteLine( "// you can use it if you wanna compile only one source file."); twSource.SplitLine(); twSource.WriteLine( "#include \"{0}_internal.c\"", assemblyName); foreach (var type in prepared.Types. Where(type => type.DeclaringType == null)) { twSource.WriteLine( "#include \"{0}/{1}/{2}.c\"", assemblyName, Utilities.GetCLanguageScopedPath(type.ScopeName), type.Name); } twSource.SplitLine(); twSource.Flush(); } }
public static string WriteCommonInternalSourceCode( CodeTextStorage storage, TranslateContext translateContext, PreparedInformations prepared, string assemblyName) { IExtractContext extractContext = translateContext; using (var twSource = storage.CreateSourceCodeWriter(assemblyName + "_internal")) { var assemblyMangledName = Utilities.GetMangledName(assemblyName); twSource.WriteLine( "// [15-1] This is {0} native code translated by IL2C, do not edit.", assemblyName); twSource.SplitLine(); twSource.WriteLine( "#include <{0}.h>", assemblyName); twSource.WriteLine( "#include <{0}_internal.h>", assemblyName); twSource.SplitLine(); var constStrings = extractContext. ExtractConstStrings(). ToArray(); if (constStrings.Length >= 1) { twSource.WriteLine("//////////////////////////////////////////////////////////////////////////////////"); twSource.WriteLine("// [9-1-2] Const strings:"); twSource.SplitLine(); foreach (var(symbolName, value) in constStrings) { twSource.WriteLine( "IL2C_CONST_STRING({0}, {1});", symbolName, Utilities.GetCLanguageExpression(value)); } twSource.SplitLine(); } var declaredValues = extractContext. ExtractDeclaredValues(). ToArray(); if (declaredValues.Length >= 1) { twSource.WriteLine("//////////////////////////////////////////////////////////////////////////////////"); twSource.WriteLine("// [12-1-2] Declared values:"); twSource.SplitLine(); foreach (var information in declaredValues) { foreach (var declaredFields in information.DeclaredFields) { twSource.WriteLine( "// {0}", declaredFields.FriendlyName); } var targetType = (information.HintTypes.Length == 1) ? information.HintTypes[0] : extractContext.MetadataContext.ByteType.MakeArray(); Debug.Assert(targetType.IsArray); var elementType = targetType.ElementType.ResolveToRuntimeType(); var values = Utilities.ResourceDataToSpecificArray(information.ResourceData, elementType); var lhs = targetType.GetCLanguageTypeName(information.SymbolName, true); twSource.WriteLine( "const {0} =", lhs); using (var _ = twSource.Shift()) { twSource.WriteLine( "{0};", Utilities.GetCLanguageExpression(values)); } } twSource.SplitLine(); } twSource.Flush(); return(twSource.RelatedPath); } }
public static string[] WriteSourceCodes( CodeTextStorage storage, TranslateContext translateContext, PreparedInformations prepared, DebugInformationOptions debugInformationOption) { IExtractContextHost extractContext = translateContext; var assemblyName = extractContext.Assembly.Name; var typesByDeclaring = prepared.Types. GroupBy(type => type.DeclaringType ?? type). ToDictionary( g => g.Key, g => g.OrderByDependant(translateContext.Assembly).ToArray()); var sourceFiles = new List <string>(); foreach (var targetType in prepared.Types. Where(type => type.DeclaringType == null)) { using (var _ = storage.EnterScope(targetType.ScopeName)) { using (var twSource = storage.CreateSourceCodeWriter(targetType.Name)) { twSource.WriteLine( "// [15-2] This is {0} native code translated by IL2C, do not edit.", assemblyName); twSource.SplitLine(); twSource.WriteLine( "#include <{0}.h>", assemblyName); twSource.WriteLine( "#include <{0}_internal.h>", assemblyName); twSource.SplitLine(); // Write assembly references at the file scope. InternalWriteAssemblyReferences( twSource, translateContext, extractContext, targetType); twSource.WriteLine("#ifdef __cplusplus"); twSource.WriteLine("extern \"C\" {"); twSource.WriteLine("#endif"); twSource.SplitLine(); InternalWriteSourceCode( twSource, extractContext, prepared, targetType, debugInformationOption, typesByDeclaring); twSource.WriteLine("#ifdef __cplusplus"); twSource.WriteLine("}"); twSource.WriteLine("#endif"); twSource.SplitLine(); twSource.Flush(); sourceFiles.Add(twSource.RelatedPath); } } } return(sourceFiles.ToArray()); }
public static string[] WriteSourceCodes( CodeTextStorage storage, TranslateContext translateContext, PreparedInformations prepared, DebugInformationOptions debugInformationOption) { IExtractContextHost extractContext = translateContext; var assemblyName = extractContext.Assembly.Name; var typesByDeclaring = prepared.Types. GroupBy(type => type.DeclaringType ?? type). ToDictionary( g => g.Key, g => g.OrderByDependant(translateContext.Assembly).ToArray()); var sourceFiles = new List <string>(); foreach (var targetType in prepared.Types. Where(type => type.DeclaringType == null)) { using (var _ = storage.EnterScope(targetType.ScopeName)) { using (var twSource = storage.CreateSourceCodeWriter(targetType.Name)) { // HACK: Unreal Engine 4 needs include directive with same file name as header extension (ex: foo.c --> foo.h) at first line. if (extractContext.TargetPlatform == TargetPlatforms.UE4) { twSource.WriteLine( "#include \"{0}.h\" // [16-1] Needs for Unreal Engine 4.", targetType.Name); twSource.SplitLine(); } twSource.WriteLine( "// [15-2] This is {0} native code translated by IL2C, do not edit.", assemblyName); twSource.SplitLine(); twSource.WriteLine( "#include <{0}.h>", assemblyName); twSource.WriteLine( "#include <{0}_internal.h>", assemblyName); twSource.SplitLine(); // Write assembly references at the file scope. InternalWriteAssemblyReferences( twSource, translateContext, extractContext, targetType); twSource.WriteLine("#ifdef __cplusplus"); twSource.WriteLine("extern \"C\" {"); twSource.WriteLine("#endif"); twSource.SplitLine(); InternalWriteSourceCode( twSource, extractContext, prepared, targetType, debugInformationOption, typesByDeclaring); twSource.WriteLine("#ifdef __cplusplus"); twSource.WriteLine("}"); twSource.WriteLine("#endif"); twSource.SplitLine(); twSource.Flush(); sourceFiles.Add(twSource.RelatedPath); } // HACK: Unreal Engine 4 needs include directive with same file name as header extension (ex: foo.c --> foo.h) at first line. if (extractContext.TargetPlatform == TargetPlatforms.UE4) { using (var twUE4Header = storage.CreateHeaderWriter(targetType.Name)) { twUE4Header.WriteLine( "// [16-2] This is {0} native code translated by IL2C, do not edit.", assemblyName); twUE4Header.WriteLine( "// It's a dummy header file for helping and using only Unreal Engine 4.", assemblyName); twUE4Header.Flush(); } } } } return(sourceFiles.ToArray()); }