/*
    Ada text macro specifications,
    Based on Apple C text macro specifications,
    Adapted by Pascal Pignard, December 2007.

    if_statement (if, if else, else, elsif)
    case_statement (case, when)
    loop_statement (loop, for, for reverse, while)
    block_statement (declare)
    extended_return_statement (todo)
    accept_statement (todo)
    select_statement (todo)
    procedure (spe, body)
    function (spe, body)
    task (todo)
    package (spe, body)
    exception (todo)
    type (enum, array, record, variant, todo)
*/
(
    //
    // Ada language macros
    //
    {
        Identifier = ada;
        Name = "Ada";
        IsMenu = YES;
        DefaultSettings = {
            PreExpressionsSpacing = " ";    // space between keyword and opening parent
            InExpressionsSpacing = "";      // space between paren and expression
            CaseStatementSpacing = "";      // indentation of a case statement
            BlockSeparator = " ";           // space between closing paren and brace (can include a newline)
            PostBlockSeparator = "\n";      // space before a new block (can include a newline)
        };
        ComputerLanguages = ( ada );
    },
        //
        // Block Statements
        //
        {
            Identifier = ada.block;
            BasedOn = ada;
            TextString = "$(Statement) $(Middle)\n\t<#!statements!#>$(End)\n";
            Statement = "$(Command) $(Expressions)";
        },
            {
                Identifier = ada.block.if;
                BasedOn = ada.block;
                Name = "If Block...>";
                IsMenuItem = YES;
                Command = "if";
                Middle  = "then";
                End     = "\nend if;";
                Expressions = "<#condition#>";
                CompletionPrefix = if;
                CycleList = (
                    ada.block.if,
                    ada.block.ifelse
                );
            },
            {
                Identifier = ada.block.ifelse;
                BasedOn = ada.block;
                Name = "If / Else Block...>";
                IsMenuItem = NO;
                Command = "if";
                Expressions = "<#condition#>";
                TextString = "$(Statement) then\n\t<#!statements!#>\nelse\n\t<#statements#>\nend if;\n";
                CompletionPrefix = ifelse;
            },
            {
                Identifier = ada.block.elseif;
                BasedOn = ada.block;
                Name = "Else If Block...>";
                IsMenuItem = NO;
                Command = "elsif";
                Middle  = "then";
                Expressions = "<#condition#>";
                CompletionPrefix = elsif;
            },
            {
                Identifier = ada.block.for;
                BasedOn = ada.block;
                Name = "For Block...>";
                IsMenuItem = YES;
                Command = "for";
                Middle  = "loop";
                End     = "\nend loop;";
                Expressions = "<#ident#> in <#subtype#>";
                CompletionPrefix = for;
                CycleList = (
                    ada.block.for,
                    ada.block.forrev
                );
            },
            {
                Identifier = ada.block.forrev;
                BasedOn = ada.block;
                Name = "For Reverse Block...>";
                IsMenuItem = NO;
                Command = "for";
                Middle  = "loop";
                End     = "\nend loop;";
                Expressions = "<#ident#> in reverse <#subtype#>";
                CompletionPrefix = forrev;
            },
            {
                Identifier = ada.block.while;
                BasedOn = ada.block;
                Name = "While Block...";
                IsMenuItem = YES;
                Command = "while";
                Middle  = "loop";
                End     = "\nend loop;";
                Expressions = "<#condition#>";
                CompletionPrefix = while;
            },
            {
                Identifier = ada.block.loop;
                BasedOn = ada.block;
                Name = "Loop Block...";
                IsMenuItem = YES;
                Command = "exit when";
                Expressions = "<#condition#>;";
                TextString = "loop\n\t<#!statements!#>\n\t$(Statement)\nend loop;\n";
                CompletionPrefix = loop;
            },
            {
                Identifier = ada.block.case;
                BasedOn = ada.block;
                Name = "Case Block...";
                IsMenuItem = YES;
                Command = "case";
                End     = "\nend case;";
                TextString = "$(Statement) is\n\twhen <#constant#> =>\n\t\t<#!statements!#>\n\twhen others => null;\nend case;\n";
                Expressions = "<#expression#>";
                CompletionPrefix = case;
            },

        {
            Identifier = ada.declareblock;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Declare Block...";
            TextString = "declare\n\t<#declarations#>\nbegin\n\t<#!statements!#>\nend;\n";
            CompletionPrefix = declare;
        },

        {
            Identifier = ada.whenblock;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "When Block...";
            TextString = "when <#constant#> =>\n\t<#!statements!#>\n";
            CompletionPrefix = when;
        },

        {
            Identifier = ada.packspe;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Package...>";
            TextString = "package <#!name!#> is\n\t<#declarations#>\nprivate\n\t<#declarations#>\nend <#!name!#>;\n";
            CompletionPrefix = packspe;
            CycleList = (
                ada.packspe,
                ada.packbody
            );
        },
        {
            Identifier = ada.packbody;
            BasedOn = ada;
            IsMenuItem = NO;
            Name = "Package Body...";
            TextString = "package body <#!name!#> is\n\t<#declarations#>\nbegin\n\t<#statements#>\nend <#!name!#>;\n";
            CompletionPrefix = packbody;
        },

        {
            Identifier = ada.procspe;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Procedure...>";
            TextString = "procedure <#!name!#> (<#param#>);\n";
            CompletionPrefix = procspe;
            CycleList = (
                ada.procspe,
                ada.procbody
            );
        },
        {
            Identifier = ada.procbody;
            BasedOn = ada;
            IsMenuItem = NO;
            Name = "Procedure Body...";
            TextString = "procedure <#!name!#> (<#param#>) is\nbegin\n\t<#statements#>\nend <#!name!#>;\n";
            CompletionPrefix = procbody;
        },

        {
            Identifier = ada.funcspe;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Function...>";
            TextString = "function <#!name!#> (<#param#>) return <#type#>;\n";
            CompletionPrefix = funcspe;
            CycleList = (
                ada.funcspe,
                ada.funcbody
            );
        },
        {
            Identifier = ada.funcbody;
            BasedOn = ada;
            IsMenuItem = NO;
            Name = "Function Body...";
            TextString = "function <#!name!#> (<#param#>) return <#type#> is\nbegin\n\t<#statements#>\n\treturn <#value#>\nend <#!name!#>;\n";
            CompletionPrefix = funcbody;
       },

        {
            Identifier = ada.elseblock;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Else Block...>";
            TextString = "else\n\t<#!statements!#>";
            CompletionPrefix = else;
                CycleList = (
                    ada.elseblock,
                    ada.block.elseif
                );
        },

        {
            Identifier = ada.enum;
            BasedOn = ada;
            IsMenuItem = NO;
            Name = "Enum Type...";
            TextString = "type <#!name!#> is (<#values#>);\n";
            CompletionPrefix = enum;
        },
        {
            Identifier = ada.record;
            BasedOn = ada;
            IsMenuItem = NO;
            Name = "Record Type...";
            TextString = "type <#!name!#> is record\n\t<#fields#>\nend record;\n}";
            CompletionPrefix = record;
        },
        {
            Identifier = ada.variant;
            BasedOn = ada;
            IsMenuItem = NO;
            Name = "Variant Type...";
            TextString = "type <#!name!#> (<#variant#>) is record\n\t<#fields#>\n\tcase <#variant#>\n\t\twhen <#value#> =>\n\t\t<#fields#>\n\t\twhen others =>\n\t\t<#fields#>\n\tend case;\nend record;\n";
            CompletionPrefix = variant;
        },
        {
            Identifier = ada.type;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Type... Definition>";
            TextString = "type <#!existing_type!#> is <#new_name#>;\n";
            CompletionPrefix = type;
            CycleList = (
                ada.type,
                ada.enum,
                ada.record,
                ada.variant
            );
        },

        {
            Identifier = ada.paren;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Parenthesize...";
            TextString = "($(InExpressionsSpacing)<#!expression!#>$(InExpressionsSpacing))";
        },
        {
            Identifier = ada.quote;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Quote...";
            TextString = "\"<#!text!#>\"";
        },

        {
            Identifier = ada.pragmamark;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Pragma...";
            TextString = "pragma <#!label!#>;\n";
            CompletionPrefix = pragma;
        },

        {
            Identifier = ada.with;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "With... Clause>";
            TextString = "with <#!file!#>;\n";
            CompletionPrefix = with;
            CycleList = (
                ada.with,
                ada.withuse
            );
        },
        {
            Identifier = ada.withuse;
            BasedOn = ada;
            IsMenuItem = NO;
            Name = "With... / Use... Clauses";
            TextString = "with <#!file!#>; use <#!file!#>;\n";
            CompletionPrefix = withuse;
        },

        {
            Identifier = ada.copyright;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Copyright Comment";
            TextString = "--  *  Created by $(FULLUSERNAME) on $(DATE).\n--  *  Copyright (c) $(YEAR) $(ORGANIZATIONNAME).\n--  *  All rights reserved.\n";
            CompletionPrefix = copyright;
        },

        {
            Identifier = ada.comment;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Comment...";
            TextString = "-- <#!comment!#>";
            CompletionPrefix = comment;
        },

        {
            Identifier = ada.separatorcomment;
            BasedOn = ada;
            IsMenuItem = YES;
            Name = "Separator Comment";
            TextString = "--------------------------------------------------------------------------------\n";
            CompletionPrefix = separator;
        }
)
