priority -50

global !p

def ada_case(word):
	out = word[0].upper()
	for i in range(1, len(word)):
		if word[i] == '-':
			out = out + '.'
		elif word[i - 1] == '_' or word[i - 1] == '-':
			out = out + word[i].upper()
		else:
			out = out + word[i]
	return out

endglobal

snippet wi "with"
with $1;$0
endsnippet

snippet pac "package"
package ${1:`!p snip.rv = ada_case(snip.basename)`} is
	$0
end $1;
endsnippet

snippet pacb "package body"
package body ${1:`!p snip.rv = ada_case(snip.basename)`} is
	$0
end $1;
endsnippet

snippet ent "entry ... when"
entry $1($2) when $3 is
begin
	$0
end $1;
endsnippet

snippet task "task"
task $1 is
	entry $0
end $1;
endsnippet

snippet taskb "task body"
task body $1 is
	$2
begin
	$0
end $1;
endsnippet

snippet acc "accept"
accept $1($2) do
	$0
end $1;
endsnippet

snippet prot "protected type"
protected type $1($2) is
	$0
end $1;
endsnippet

snippet prob "protected body"
protected body $1 is
	$2
begin
	$0
end $1;
endsnippet

snippet gen "generic type"
generic
	type $1 is $2;$0
endsnippet

snippet ty "type"
type $1 is $2;$0
endsnippet

snippet tyd "type with default value"
type $1 is $2
	with Default_Value => $3;$0
endsnippet

snippet subty "subtype"
subtype $1 is $2;$0
endsnippet

snippet dec "declare block"
declare
	$1
begin
	$0
end;
endsnippet

snippet decn "declare named block"
$1:
declare
	$2
begin
	$0
end $1;
endsnippet

snippet ifex "if expression"
if $1 then $2 else $0
endsnippet

snippet casex "case expression"
case $1 is
	when $2 => $3,$0
endsnippet

snippet fora "for all"
for all $1 ${2:in} $3 => $0
endsnippet

snippet fors "for some"
for some $1 ${2:in} $3 => $0
endsnippet

snippet if "if"
if $1 then
	$0
end if;
endsnippet

snippet ife "if ... else"
if $1 then
	$2
else
	$0
end if;
endsnippet

snippet el "else"
else
	$0
endsnippet

snippet eif "elsif"
elsif $1 then
	$0
endsnippet

snippet wh "while"
while $1 loop
	$0
end loop;
endsnippet

snippet nwh "named while"
$1:
while $2 loop
	$0
end loop $1;
endsnippet

snippet for "for"
for ${1:I} in $2 loop
	$0
end loop;
endsnippet

snippet fore "for each"
for $1 of $2 loop
	$0
end loop;
endsnippet

snippet nfor "named for"
$1:
for ${2:I} in $3 loop
	$0
end loop $1;
endsnippet

snippet nfore "named for each"
$1:
for $2 of $3 loop
	$0
end loop $1;
endsnippet

snippet proc "procedure"
procedure $1($2) is
	$3
begin
	$0
end $1;
endsnippet

snippet procd "procedure declaration"
procedure $1;$0
endsnippet

snippet fun "function"
function $1($2) return $3 is
	$4
begin
	$0
end $1;
endsnippet

snippet fune "expression function"
function $1 return $2 is
	($3);$0
endsnippet

snippet fund "function declaration"
function $1 return $2;$0
endsnippet

snippet ret "extended return"
return $1 do
	$0
end return;
endsnippet

snippet rec "record"
record
	$0
end record;
endsnippet

snippet case "case"
case $1 is
	when $2 => $3;$0
end case;
endsnippet

snippet whe "when"
when $1 => $2;$0
endsnippet

snippet wheo "when others"
when others => $1;$0
endsnippet

snippet lo "loop"
loop
	$0
end loop;
endsnippet

snippet nlo "named loop"
$1:
loop
	$0
end loop $1;
endsnippet

snippet ex "exit when"
exit when $1;$0
endsnippet

snippet put "Ada.Text_IO.Put"
Ada.Text_IO.Put($1);$0
endsnippet

snippet putl "Ada.Text_IO.Put_Line"
Ada.Text_IO.Put_Line($1);$0
endsnippet

snippet get "Ada.Text_IO.Get"
Ada.Text_IO.Get($1);$0
endsnippet

snippet getl "Ada.Text_IO.Get_Line"
Ada.Text_IO.Get_Line($1);$0
endsnippet

snippet newline "Ada.Text_IO.New_Line"
Ada.Text_IO.New_Line(${1:1});$0
endsnippet

# vim:ft=snippets: