Exemplo n.º 1
0
        private static void GenerateContent(ParseResult[] parseResults, CodeGenBuilders builders)
        {
            foreach (var parseResult in parseResults)
            {
                if (ECSParseResultUtilities.IsSettingsFile(parseResult.rawText) ||
                    ECSParseResultUtilities.IsTagFile(parseResult.rawText))
                {
                    continue;
                }

                if (parseResult.structs.Count > 1)
                {
                    string error = string.Format("Error in file {0}: more than one struct contained, only one allowed.", parseResult.fileName);
                }

                if (!ECSNaming.IsProperComponentName(parseResult.structs[0].name))
                {
                    string error = string.Format("Illegal component name in file {0}: {1}, must follow the format CComponent.", parseResult.fileName, parseResult.structs[0].name);
                    throw new Exception(error);
                }

                GenerateCppContent(parseResult, builders);
                GenerateCsharpContent(parseResult, builders);
            }
        }
Exemplo n.º 2
0
        private static void GenerateCsharpContent(ParseResult parseResult, CodeGenBuilders builders)
        {
            CppParser.CppStruct cppStruct = parseResult.structs[0];

            // CS: Generate struct
            string allMembers = "";

            foreach (var member in cppStruct.members)
            {
                if (String.IsNullOrEmpty(member))
                {
                    throw new Exception(string.Format("Struct {0} has a blank member, perhaps an unsupported type when converting C++ to C#", cppStruct.name));
                }
                allMembers += string.Format("\tpublic {0}\n", member);
            }

            string structFormat =
                "public struct {0}\n" +
                "{{\n" +
                "{1}" +
                "}}\n";

            builders.Csharp.Structs.Append(string.Format(structFormat, cppStruct.name, allMembers));

            // CS: Generate delegate state/components
            string delegateReturnType = cppStruct.name;
            string delegateParam      = ECSParseResultUtilities.IsStateFile(parseResult.rawText) ?
                                        "" :
                                        "UInt32 entity";
            string getFunctionName      = GenerateGetFunctionName(ECSParseResultUtilities.IsStateFile(parseResult.rawText), cppStruct.name);
            string delegateDelclaration = string.Format(
                "\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n" +
                "\tpublic delegate {0} {1}Type({2});\n" +
                "\tpublic static {1}Type {1};\n\n",
                delegateReturnType,
                getFunctionName,
                delegateParam);

            builders.Csharp.DelegateDeclaration.Append(delegateDelclaration);

            // CS: Generate getter state/components
            string delegateAssignment = string.Format(
                "\t\t{0} = Bindings.GetDelegate<{0}Type>(libraryHandle, \"{0}\");\n",
                getFunctionName
                );

            builders.Csharp.DelegateAssignment.Append(delegateAssignment);
        }
Exemplo n.º 3
0
        private static void GenerateCppContent(ParseResult parseResult, CodeGenBuilders builders)
        {
            string include = string.Format("#include \"Components/{0}\"\n", parseResult.fileName);

            builders.Cpp.HeaderFiles.Append(include);

            // CPP: Generate functionName
            string componentTypeName = parseResult.structs[0].name;
            string getFunctionName   = GenerateGetFunctionName(ECSParseResultUtilities.IsStateFile(parseResult.rawText), componentTypeName);

            // CPP: Get component/state
            if (ECSParseResultUtilities.IsComponentFile(parseResult.rawText))
            {
                builders.Cpp.GetComponentFunctions.Append(string.Format("DEFINE_GET_COMPONENT({0}, {1})\n", componentTypeName, getFunctionName));
            }
            else if (ECSParseResultUtilities.IsStateFile(parseResult.rawText))
            {
                builders.Cpp.GetStateFunctions.Append(string.Format("DEFINE_GET_GAME_STATE({0}, {1})\n", componentTypeName, getFunctionName));
            }
        }