Пример #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(Asn1Node.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("}");
            }
Пример #2
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.TypeDefinition)
            {
                Output.Append(ToCSharp(this.Name));
                Output.Append("Choice");
            }
            else
            {
                if (Pass == CSharpExportPass.Implicit)
                {
                    State.ClosePending(Output);

                    foreach (Asn1Node Node in this.Nodes)
                        Node.ExportCSharp(Output, State, Indent, Pass);

                    Output.Append(Tabs(Indent));
                    Output.Append("public enum ");
                    Output.Append(ToCSharp(this.Name));
                    Output.AppendLine("Enum");

                    Output.Append(Tabs(Indent));
                    Output.Append("{");

                    Indent++;

                    bool First = true;

                    foreach (Asn1Node Node in this.Nodes)
                    {
                        if (Node is Asn1FieldDefinition Field)
                        {
                            if (First)
                                First = false;
                            else
                                Output.Append(',');

                            Output.AppendLine();
                            Output.Append(Tabs(Indent));
                            Output.Append(Field.Name);
                        }
                    }

                    Indent--;

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

                if (Pass == CSharpExportPass.Implicit || Pass == CSharpExportPass.Explicit)
                {
                    Output.Append(Tabs(Indent));
                    Output.Append("public class ");
                    Output.Append(ToCSharp(this.Name));
                    if (!this.TypeDefinition)
                        Output.Append("Choice");
                    Output.AppendLine();

                    Output.Append(Tabs(Indent));
                    Output.AppendLine("{");

                    Indent++;

                    Output.Append(Tabs(Indent));
                    Output.Append(ToCSharp(this.Name));
                    if (!this.TypeDefinition)
                        Output.Append("Enum");
                    Output.AppendLine(" _choice;");

                    foreach (Asn1Node Node in this.Nodes)
                        Node.ExportCSharp(Output, State, Indent, CSharpExportPass.Explicit);

                    Indent--;

                    Output.Append(Tabs(Indent));
                    Output.AppendLine("}");
                    Output.AppendLine();
                }
            }
        }
Пример #3
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)
 {
     // Don't export macro.
 }