Warning, /frameworks/ktexteditor/autotests/input/indent/ada/longtest/origin is written in an unsupported language. File is not indexed.

0001 --
0002 --
0003 
0004 
0005 --
0006 
0007 with text_io;
0008 use text_io;
0009 
0010 with Ada.Integer_Text_IO;
0011 use  Ada.Integer_Text_IO;
0012 
0013 
0014 package Package_With_Private is
0015 
0016 type Private_Type is private;
0017 
0018 private
0019 
0020 type Private_Type is array (1 .. 10) of Integer;
0021 
0022 end Package_With_Private;
0023 
0024 
0025 procedure Range_1( i : integer );   -- forward declaration
0026 
0027 
0028 Block_Name :   -- CHECK: block labels are handled sensibly
0029 declare
0030 A_Variable : The_Type;
0031 begin
0032 Use A_Variable
0033 end Block_Name;
0034 
0035 generic
0036 Max: Positive;
0037 type Element_T is private;
0038 package Generic_Stack is
0039 procedure Push (E: Element_T);
0040 function Pop return Element_T;
0041 end Generic_Stack;
0042 
0043 
0044 procedure Generic_Swap is
0045 generic
0046 type Item is private;
0047 procedure Exchange(X, Y: in out Item);
0048 procedure Exchange(X, Y: in out Item) is
0049 Temp: Item;
0050 begin
0051 Temp := X;
0052 Result.Elements (i, Result.Elements'Last (2))
0053 := 3 + Right.Elements (i);
0054 a := long_expression
0055 + another_long_expression;     -- CHECK: this should be indented
0056 func
0057 ( a,
0058 b
0059 );
0060 Y := func
0061 ( a,
0062 b
0063 );
0064 Y :=
0065 func
0066 ( a,
0067 b
0068 );
0069 end;
0070 
0071 A, B : Integer;
0072 procedure Swap is new Exchange(integer);
0073 
0074 begin
0075 A := 1;
0076 B := 2;
0077 Swap(A,B);
0078 Ada.Float_Text_IO.put                        --  Float literal
0079 (Item => gamma(i), Fore => 1, Aft => 1, Exp => 0);
0080 new_line;
0081 Ada.Float_Text_IO.put(                        --  Float literal
0082       Item => gamma(i), Fore => 1, Aft => 1, Exp => 0);
0083 new_line;
0084 return( a+b );
0085 return(
0086 a+b );
0087 return
0088 ( a
0089 +b);
0090 
0091 end Generic_Swap;
0092 
0093 
0094 function SUBSTRING (DSTR: DYN_STRING;   -- this is a forward reference
0095 START  : natural;
0096 LENGTH : natural := 0)
0097 return DYN_STRING;
0098 
0099 function SUBSTRING (DSTR: DYN_STRING;
0100 LENGTH : natural := 0)
0101 return DYN_STRING is
0102 DS: DYN_STRING;
0103 L : natural := LENGTH;
0104 
0105 type Degrees is new Float range -273.15 .. Float'Last;
0106 Temperature : Degrees;
0107 
0108 type Car is record
0109 Identity       : Long_Long_Integer;
0110 Number_Wheels  : Positive range 1 .. 10;
0111 Paint          : Color;
0112 Horse_Power_kW : Float range 0.0 .. 2_000.0;
0113 Consumption    : Float range 0.0 .. 100.0;
0114 end record;
0115 
0116 BMW : Car :=
0117 (Identity       => 2007_752_83992434,
0118 Number_Wheels  => 5,
0119 Horse_Power_kW => 190.0,
0120 Consumption    => 10.1,
0121 Paint          => Blue);
0122 
0123 type Directions is (North, South, East, West);
0124 Heading : Directions;
0125 
0126 begin
0127 put_line("It works!");
0128 
0129 case long_expression
0130 + Another_long_expression is
0131 when 89 ==>
0132 s1;
0133 s2;
0134 <<lab>>         -- CHECK: label should be aligned with begin
0135 #
0136 when 1 =>
0137 Walk_The_Dog;
0138 
0139 when 16#5# ==>
0140 a := 5;
0141 a := 9;
0142 f(18);
0143 s1;
0144 
0145 #include "fred"
0146 
0147 when 5 =>
0148 case Heading is
0149 when North =>
0150 Y := Y + 1;
0151 when South =>
0152 Y := Y - 1;
0153 when East =>
0154 X := X + 1;
0155 when West =>
0156 X := X - 1;
0157 end case;
0158 
0159 when 8 | 10 =>
0160 
0161 Sell_All_Stock;
0162 
0163 when others =>
0164 
0165 if Temperature >= 40.0 then
0166 Put_Line ("Wow!");
0167 Put_Line ("It's extremely hot");
0168 elsif Temperature >= 30.0 then
0169 Put_Line ("It's hot");
0170 elsif Temperature >= 20.0 then
0171 Put_Line ("It's warm");
0172 elsif Temperature >= 10.0 then
0173 Put_Line ("It's cool");
0174 elsif Temperature >= 0.0 then
0175 Put_Line ("It's cold");
0176 else
0177 Put_Line ("It's freezing");
0178 end if;
0179 
0180 end case;
0181 
0182 DS3.DATA(1..DS3.SIZE):=   DS1.DATA(1..DS1.SIZE)
0183          & DS2.DATA(1..DS2.SIZE);
0184 return DS3;  -- CHECK: should align with DS3 above
0185 end main;
0186 
0187 
0188 procedure Quadratic_Equation
0189 (A, B, C :     Float;   -- By default it is "in".
0190 R1, R2  : out Float;
0191 Valid   : out Boolean)
0192 is
0193 Z : Float;
0194 
0195 type Discriminated_Record (Size : Natural) is
0196 record
0197 A : String (1 .. Size);
0198 B : Integer;
0199 end record;
0200 
0201 begin
0202 Z := B**2 - 4.0 * A * C;
0203 
0204 if At_Location > In_Text'Last
0205 or else At_Location + Pattern'Length - 1 >
0206 In_Text'Last
0207 or else Slided_Text_T (In_Text (
0208                      At_Location .. At_Location + Pattern'Length - 1)) /=
0209 Slided_Pattern
0210 then
0211 Valid := False;  -- Being out parameter, it should be modified at least once.
0212 R1    := 0.0;
0213 R2    := 0.0;
0214 <<lab>>
0215 else
0216 Valid := True;
0217 R1    := (-B + Sqrt (Z)) / (2.0 * A);
0218 R2    := (-B - Sqrt (Z)) / (2.0 * A);
0219 end if;
0220 end Quadratic_Equation;
0221 
0222 
0223 procedure Error_Handling_4 is
0224 
0225 Float_Error : exception;
0226 
0227 type DEVICE is (PRINTER, DISK, DRUM);
0228 type STATE  is (OPEN, CLOSED);
0229 
0230 type PERIPHERAL(UNIT : DEVICE := DISK) is
0231 record
0232 STATUS : STATE;
0233 case UNIT is
0234 when PRINTER =>
0235 LINE_COUNT : INTEGER range 1 .. PAGE_SIZE;
0236 when others =>
0237 CYLINDER   : CYLINDER_INDEX;
0238 TRACK      : TRACK_NUMBER;
0239 end case;
0240 end record;
0241 
0242 
0243 function Square_Root (X : in Float) return Float is
0244 use Ada.Numerics.Elementary_Functions;
0245 begin
0246 if (X < 0.0) then
0247 raise Float_Error;
0248 else
0249 return Sqrt (X);
0250 end if;
0251 end Square_Root;
0252 
0253 begin
0254 
0255 begin
0256 C := Square_Root (A ** 2 + B ** 2);
0257 
0258 T_IO.Put ("C is ");
0259 F_IO.Put
0260 (Item => C,
0261 Fore => (F_IO.Default_Fore +
0262 1 ),
0263 Aft  => F_IO.Default_Aft,
0264 Exp  => F_IO.Default_Exp);
0265 exception
0266 when Constraint_Error =>
0267 T_IO.Put ("C cannot be calculated!");
0268 end;
0269 
0270 return;
0271 end Error_Handling_4;
0272 
0273 
0274 procedure Range_1 is
0275 type Range_Type is range -5 .. 10;
0276 
0277 Default_String : constant String := "This is the long string returned by" &
0278                   " default.  It is broken into multiple" &
0279                   " Ada source lines for convenience.";
0280 
0281 Another_Default_String : constant String :=
0282 "This is the long string returned by" &
0283 " default.  It is broken into multiple" &
0284 " Ada source lines for convenience.";
0285 
0286 type Op_Codes_In_Column is
0287 ( Push,
0288 Pop,
0289 Add );
0290 
0291 package T_IO renames Ada.Text_IO;
0292 package I_IO is
0293 new  Ada.Text_IO.Integer_IO (Range_Type);
0294 
0295 a: real;
0296 
0297 
0298 begin
0299 for A in Range_Type loop
0300 I_IO.Put (Item  => A,
0301 Width => 3,                   -- CHECK: params should line up
0302 Base  => 10);
0303 
0304 if A < Range_Type'Last then
0305 Process_Each_Page:
0306 loop
0307 
0308 declare
0309 package Float_100_Stack is new Generic_Stack (100, Float);
0310 use Float_100_Stack;
0311 begin
0312 Push (45.8);
0313 end;
0314 
0315 Process_All_The_Lines_On_This_Page:
0316 loop
0317 s1;
0318 exit Process_All_The_Lines_On_This_Page when Line_Number = Max_Lines_On_Page;
0319 s2;
0320 Look_For_Sentinel_Value:
0321 loop
0322 s3;
0323 exit Look_For_Sentinel_Value when Current_Symbol = Sentinel;
0324 s4;
0325 end loop Look_For_Sentinel_Value;
0326 s5;
0327 end loop Process_All_The_Lines_On_This_Page;
0328 s6;
0329 exit Process_Each_Page when Page_Number = Maximum_Pages;
0330 s7;
0331 end loop Process_Each_Page;
0332 else
0333 T_IO.New_Line;
0334 
0335 -- comment below scans back to here !!??
0336 for I in  A'Range (1) loop
0337 for J in  A'Range (2) loop
0338 Sum := 0.0;
0339 for R in  A'Range (2) loop
0340 Sum := Sum + A.all (I, R) * B.all (R, J);
0341 end loop;
0342 C.all (I, J) := Sum +
0343             second_part_of_long_expression +
0344             third_part_of_long_expression;
0345 if Input_Found then
0346 Count_Characters;
0347 
0348 else  --not Input_Found
0349 Reset_State;
0350 Character_Total :=
0351 First_Part_Total  * First_Part_Scale_Factor  +
0352 Second_Part_Total * Second_Part_Scale_Factor +
0353 Default_String'Length + Delimiter_Size;
0354 end if;
0355 
0356 end loop;
0357 end loop;
0358 end if;
0359 end loop;
0360 end Range_1;
0361 
0362 -- generic instantiation   -- TODO: wrong, ...
0363 -- ... statementIndent() scans back to for R in A'Range ... ??? ...
0364 -- ... because it skips over the ends
0365 
0366 package Day_Of_Month_IO is  -- TODO: scans back to beginning of file: generic? should have stopped at 'procedure'
0367 new Ada.Text_IO.Integer_IO (Day_Of_Month);
0368 
0369 procedure f;
0370 
0371 -- CHECK: these should be recognised as forward procedures ...
0372 procedure Day_Of (Day, Month, Year : in Integer;
0373 Result           : out Integer);
0374 procedure x;
0375 procedure x1;
0376 
0377 procedure TRAVERSE_TREE;
0378 procedure INCREMENT(X : in out INTEGER);
0379 procedure RIGHT_INDENT(MARGIN : out LINE_SIZE);          --  see 3.5.4
0380 procedure SWITCH(FROM, TO : in out LINK);                --  see 3.8.1
0381 
0382 function RANDOM return PROBABILITY;                      --  see 3.5.7
0383 
0384 function MIN_CELL(X : LINK) return CELL;                 --  see 3.8.1
0385 function NEXT_FRAME(K : POSITIVE) return FRAME;          --  see 3.8
0386 function DOT_PRODUCT(LEFT,RIGHT: VECTOR) return REAL;    --  see 3.6
0387 
0388 function "*"(LEFT,RIGHT : MATRIX) return MATRIX;         --  see 3.6
0389 
0390 procedure Nesting is
0391 
0392 procedure Triple is
0393 
0394 procedure Second_Layer(Persistence : in out Persistence_View;
0395          Stream      : not null access Root_Stream_Type'Class)
0396 is
0397 
0398 procedure Bottom_Layer is
0399 begin
0400 Put_Line("This is the Bottom Layer talking.");
0401 Do_Something;
0402 
0403 if Test then
0404 goto Exit_Use_Goto;
0405 end if;
0406 Do_Something_Else;
0407 <<Label>>
0408 
0409 <<Exit_Use_Goto>>  -- CHECK: should align with 'begin'
0410 return;
0411 end Bottom_Layer;
0412 
0413 begin -- Second_Layer
0414 Put_Line("This is the Second Layer talking.");
0415 Bottom_Layer;
0416 <<Exit_Use_Goto>>  -- CHECK: should align with 'begin'
0417 Put_Line("We are back up to the Second Layer.");
0418 end Second_Layer;
0419 
0420 begin -- Triple
0421 Put_Line("This is procedure Triple talking to you.");
0422 Second_Layer;
0423 Put_Line("We are back up to the procedure named Triple.");
0424 end Triple;
0425 
0426 begin -- Nesting
0427 Put_Line("Start the triple nesting here.");
0428 Triple;
0429 Put_Line("Finished, and back to the top level.");
0430 end Nesting;
0431 
0432 
0433 procedure Proced3 is
0434 
0435 Dogs, Cats, Animals : INTEGER;
0436 
0437 -- This is a procedure specification
0438 procedure Total_Number_Of_Animals(Variety1 : in     INTEGER;
0439                   Variety2 : in     INTEGER;
0440                   Total    :    out INTEGER);
0441 
0442 -- This is a procedure body
0443 procedure Total_Number_Of_Animals(Variety1 : in     INTEGER;
0444                   Variety2 : in     INTEGER;
0445                   Total    :    out INTEGER) is
0446 begin
0447 Total := Variety1 + Variety2;
0448 end Total_Number_Of_Animals;
0449 
0450 begin
0451 Dogs := 3;
0452 Cats := 4;
0453 if some_condition
0454 or some_other_condition
0455 or yet_another_condition
0456 then
0457 action( a,
0458 b+c,
0459 c + d
0460 + e +f +g,  -- would be nice if this was indented
0461 );
0462 
0463 end if;
0464 
0465 Total_Number_Of_Animals(Dogs, Cats, Animals);
0466 Put("The total number of animals is");
0467 Put(Animals, 3);
0468 if cond then
0469 while c loop
0470 for i in integer  -- multiline for loop
0471 range 1..1000
0472 loop
0473 a := long_expression
0474 + long_expression
0475 + long_expression;
0476 a(i) := 10;
0477 end loop;
0478 a := long_expression
0479 + long_expression
0480 + long_expression;
0481 
0482 while x > 0
0483 and x <= 100
0484 loop                -- CHECK: not indented
0485 loop             -- CHECK: indented
0486 a := q1 +
0487 q2 +
0488 q3;
0489 end loop;
0490 end loop;
0491 
0492 while x > 0 loop
0493 loop -- forever loop
0494 aaaaaaa :=
0495 q1 +
0496 q2 +
0497 q3;
0498 end loop;
0499 end loop;
0500 end loop;
0501 
0502 end loop;
0503 
0504 fredzarmplezzzzzzzzzzzz(       arg1,
0505                   arg1,
0506                   arg2,
0507                   arg3
0508          );
0509 x := f(a) + f(b);
0510 fffffffffffff(    func0(  func1(    func2( f3(       arg1,
0511                                        arg2,
0512                                        arg3,
0513                                        arg4
0514                               ),
0515                               a1,  -- should be aligned with arg f3, not '('
0516                               a2,
0517                               a3,
0518                               a4
0519                            ),
0520 
0521                      aa2,
0522                      aa3,
0523                      aa4,
0524                      aa5
0525                   ),
0526             bb1,
0527             bb2,
0528             bb3,
0529             bb4
0530          ),
0531    cc1,
0532    cc2,
0533    cc3,
0534    cc4
0535 );
0536 
0537 s1;
0538 end if;
0539 
0540 New_Line;
0541 end Proced3;
0542 
0543 
0544 procedure Main is
0545 task Sub is
0546 entry Wake_Up(I: Integer);
0547 end Sub;
0548 
0549 task body Sub is
0550 Stop: Boolean := False;
0551 begin
0552 while not Stop loop
0553 Put("Sub:  Wait"); New_Line(1);
0554 accept Wake_Up(I: Integer) do
0555 Put("Sub:  "); Put(I); New_Line(1);
0556 if I = 0 then
0557 Stop := True;
0558 end if;
0559 end Wake_Up;
0560 end loop;
0561 Put("Sub:  Stop"); New_Line(1);
0562 end Sub;
0563 begin
0564 Extract_Publisher:
0565 for Index in Base_11_Digits (Item.Country + 1) ..
0566 Base_11_Digits (Item.Publisher) loop
0567 declare
0568 
0569 Digit : constant Natural range 0 .. 9
0570 := Natural (Item.Number (Index));
0571 Power : constant Natural range 0 .. 9
0572 := Item.Publisher - Natural (Index);
0573 
0574 begin
0575 Publisher := Publisher + Digit * (10 ** Power);
0576 end;
0577 end loop Extract_Publisher;   -- CHECK: matches 'for' above
0578 
0579 Put("Main: Stop"); New_Line(1);
0580 declare
0581 begin
0582 end;
0583 if c
0584 and c2
0585 then
0586 s1;
0587 for i in a'range
0588 loop
0589 loop
0590 s12;
0591 s13;
0592 end lop;
0593 end loop;
0594 elsif c05
0595 or c06
0596 then
0597 s12;
0598 elsif c1 then
0599 s2;
0600 else
0601 s3;
0602 a12 :=
0603 f(13);
0604 end if;
0605 end;
0606 end;
0607 
0608 
0609 package Utilities is
0610 generic
0611 type Item is private;
0612 procedure Swap(L, R : in out Item);
0613 -- A handy package at the project-specific level
0614 -- A constrained generic formal parameter
0615 generic
0616 type Item is (<>);
0617 function Next (Data : Item) return Item;
0618 -- A discrete type generic formal parameter
0619 generic
0620 type Item is (<>);
0621 -- A discrete type generic formal parameter
0622 function Prev (Data : Item) return Item;
0623 -- more generic subprograms as appropriate to your particular project needs
0624 end Utilities;
0625 
0626 
0627 // kate: line-numbers true; indent-width 3; replace-tabs on
0628 // kate: debugMode off