예제 #1
0
        /// <summary>
        /// Exports to C#
        /// </summary>
        /// <param name="Output">C# Output.</param>
        /// <param name="State">C# export state.</param>
        /// <param name="Indent">Indentation</param>
        /// <param name="Pass">Export pass</param>
        public override void ExportCSharp(StringBuilder Output, CSharpExportState State,
                                          int Indent, CSharpExportPass Pass)
        {
            if (Pass == CSharpExportPass.Explicit && !(this.body is null))
            {
                if (!(this.body.Imports is null))
                {
                    foreach (Asn1Import Import in this.body.Imports)
                    {
                        if (string.IsNullOrEmpty(Import.Module))
                        {
                            continue;
                        }

                        Asn1Document ImportedDocument;

                        if (State.Settings.ContainsCode(Import.Module))
                        {
                            ImportedDocument = State.Settings.GetDocument(Import.Module);
                        }
                        else
                        {
                            ImportedDocument = Import.LoadDocument();
                            string CSharp = ImportedDocument.ExportCSharp(State.Settings);
                            State.Settings.AddCode(Import.Module, CSharp, ImportedDocument);
                        }

                        Output.Append("using ");
                        Output.Append(State.Settings.Namespace(Import.Module));
                        Output.AppendLine(";");
                    }

                    Output.AppendLine();
                }
                else
                {
                    Output.AppendLine();
                }

                Output.Append(Tabs(Indent));
                Output.Append("namespace ");
                Output.Append(State.Settings.BaseNamespace);
                Output.Append('.');
                Output.AppendLine(ToCSharp(this.identifier));
                Output.Append(Tabs(Indent));
                Output.AppendLine("{");
                Indent++;

                if (!(this.body.Imports is null))
                {
                    foreach (Asn1Import Import in this.body.Imports)
                    {
                        if (string.IsNullOrEmpty(Import.Module))
                        {
                            continue;
                        }

                        Asn1Document ImportedDocument = State.Settings.GetDocument(Import.Module);
                        Asn1Node[]   Nodes            = ImportedDocument.Root?.Body?.Items;

                        if (!(Nodes is null))
                        {
                            foreach (Asn1Node Node in Nodes)
                            {
                                if (Node is Asn1TypeDefinition TypeDef &&
                                    !TypeDef.ConstructedType &&
                                    Array.IndexOf <string>(Import.Identifiers, TypeDef.Name) >= 0)
                                {
                                    TypeDef.ExportCSharp(Output, State, Indent, CSharpExportPass.Preprocess);
                                }
                            }
                        }
                    }
                }

                this.body.ExportCSharp(Output, State, Indent, CSharpExportPass.Preprocess);
                State.ClosePending(Output);

                this.body.ExportCSharp(Output, State, Indent, CSharpExportPass.Variables);
                State.ClosePending(Output);

                this.body.ExportCSharp(Output, State, Indent, CSharpExportPass.Explicit);
                State.ClosePending(Output);

                Indent--;
                Output.Append(Tabs(Indent));
                Output.AppendLine("}");
            }