Warning, /frameworks/ktexteditor/autotests/input/indent/pascal/longtest3/expected is written in an unsupported language. File is not indexed.

0001 // kate: space-indent on; indent-width 3; replace-tabs on; remove-trailing-spaces all;
0002 // kate: syntax pascal; indent-mode pascal;
0003 
0004 // these variables are understood by the pascal indenter ...
0005 // kate: cfgIndentCase true;          // indent elements in a case statement
0006 // kate: cfgIndentBegin 2;            // indent 'begin' this many spaces
0007 // kate: debugMode false;              // show how indent is determined
0008 // kate: cfgAutoInsertStar true;      // auto insert '*' in (* ... *)-comments
0009 // kate: cfgSnapParen true;           // snap ')' to '*)' in comments
0010 
0011 
0012 function f1( var z: integer;
0013              var p,q : real;
0014              t : boolean           ) : integer; // indentation should line up
0015 
0016 type   tArray = array[0..17] of real;
0017 
0018    r= record a: integer; c: char; end;
0019 
0020    // nested variant record - too hard to get right. tough
0021    MyRec = Record
0022               X : Longint;
0023               Case byte of
0024                  1,2,8 : (Y : Longint;
0025                           case byte of
0026                           3 : (Z : Longint);   // CHECK: parens inside parens aligned correctly
0027                          );
0028            end;
0029 
0030    commands = (    crsupp,crbefore,blinbefore,
0031                    dindonkey,dindent,spbef,
0032                    spaft,gobsym,
0033                    inbytab,   { indent current margin (was indent from symbol pos) }
0034                    crafter,
0035                    finl            { force symbol to follow on same line as previous symbol }
0036               );
0037 
0038    tR = record
0039            i: integer;  // should indent after record
0040            r: real;
0041            a: array[1..11] of char;
0042 
0043            case boolean of
0044               true:( a: int);
0045               dontKnow:
0046                  (z: real;
0047                   fred : real;       // should be indented after case value
0048                   joe  : integer;
0049                  );
0050               false:
0051                  (  ted : array[
0052                                    1..16
0053                                ] of boolean;
0054                     moe: char; // should align to ''ted''
0055                  );
0056         end; // end of case + end of record
0057 
0058    commandset = set of commands;       // should be aligned to 'record', not 'case'
0059 
0060 begin { f1 }
0061    case currsym^.name of
0062 
0063       { for procs, etc just record that we have one, wait for name }
0064       progsym, procsym, funcsym: begin
0065           symbol_seen := procsym;
0066           proc_state := proc_header;
0067           annotate_push( procsym );
0068          end;
0069       s1;                   // coding error, a case value should be here
0070          { remember we are in the declaraions part }
0071       varsym, typesym, constsym, labelsym:
0072          proc_state := proc_declarations;
0073 
0074          { if it's a proc, there will be no begin/end ==> pop info we just saved
0075          if it's an external var ==> do nothing  }
0076       forwardsym, externalsym:
0077          if proc_state = proc_header then begin
0078             sym := annotate_pop;
0079             tok := annotate_pop_tok;
0080             if annotate_trace in traceFlags then
0081                writeln( 'undo ', tok.val:tok.len );
0082          end;
0083 
0084          { if a proc has just occurred, this is its name
0085          otherwise, remember it, just in case it's a record name }
0086       othersym: begin
0087           if symbol_seen = procsym then begin
0088              tok.val := currsym^.value;
0089              tok.len := currsym^.length;
0090              annotate_push_tok( tok );
0091              symbol_seen := othersym;
0092           end
0093           else begin
0094              annotate_temp_tok.val := currsym^.value;
0095              annotate_temp_tok.len := currsym^.length;
0096           end;
0097          end;
0098 
0099          { we have the name, push it so the end symbol can get it back }
0100       recordsym: begin
0101           annotate_push_tok(annotate_temp_tok);
0102           annotate_push( recordsym );
0103           symbol_seen := recordsym;
0104          end;
0105 
0106          { we must remember these so they can pushed if the begin symbol occurs }
0107       ifsym, forsym, whilesym, withsym: begin
0108           symbol_seen := currsym^.name;
0109          end;
0110 
0111          { this is the second part of an if statement }
0112       elsesym:
0113          symbol_seen := ifsym;
0114 
0115          { if in a declaration ==> ignore
0116          if in a statement (assume case statement) ==> prepare for possible begin following }
0117       colon:
0118          if proc_state = proc_statements then
0119             symbol_seen := colon;
0120 
0121          { reset symbol_seen }
0122       semicolon:
0123          symbol_seen := semicolon;
0124 
0125          { could be the begin of a proc
0126          ==> get value, leaving it for the corresponding end symbol
0127          or it could be part of an if, etc,
0128          ==> push the symbol so the end symbol knows what to do  }
0129       beginsym: begin
0130           proc_state := proc_statements;
0131           if symbol_seen in [ifsym, forsym, whilesym, withsym, elsesym, colon] then begin
0132              annotate_push( symbol_seen );
0133           end
0134           else begin
0135              sym := annotate_peek;
0136              if sym = procsym then begin
0137                 { this is a proc begin, add annotation }
0138                 annotate_pending_tok := true;
0139                 annotate_temp_tok := annotate_peek_tok;
0140              end
0141              else begin
0142                 if annotate_trace in traceFlags then
0143                    writeln( infilename,' line ', inlines, ': orphaned begin found' );
0144                 annotate_push( nosymbol );
0145              end
0146           end;
0147          end;
0148 
0149          { push the symbol so the end symbol can get it back }
0150       casesym: annotate_push( casesym );
0151 
0152          { end of proc, end of record  ==> pop name
0153          end of if, etc statement    ==> pop symbol
0154          end of case item (colon)    ==> ignore
0155          end of record ==> check if named record  }
0156       endsym: begin
0157           symbol_seen := endsym;
0158           sym := annotate_pop;
0159           if sym = recordsym then begin
0160              annotate_temp_tok := annotate_pop_tok;
0161              if annotate_temp_tok.val[1] in ['A'..'Z','a'..'z'] then
0162                 annotate_pending_tok := true;
0163           end
0164           else if sym = procsym then begin
0165              annotate_pending_tok := true;
0166              annotate_temp_tok := annotate_pop_tok;
0167           end
0168           else if sym = ifsym then begin
0169              { if there's an else part, don't do an annotation here }
0170              if nextsym^.name <> elsesym then begin
0171                 annotate_pending := true;
0172                 annotate_temp := sym;
0173              end
0174           end
0175           else if sym in [forsym, whilesym, withsym, casesym] then begin
0176              annotate_pending := true;
0177              annotate_temp := sym;
0178           end
0179           else if sym = colon then begin
0180              if annotate_trace in traceFlags then
0181                 writeln( 'case item not annotated' );
0182           end
0183           else begin
0184              if annotate_trace in traceFlags then
0185                 writeln( infilename,' line: ', inlines, ' end symbol found but not handled' );
0186           end;
0187          end;
0188    end; { case }
0189 
0190    if annotate_pending then begin
0191       if nextsym^.crsbefore > 0 then begin
0192          { rest of line is empty }
0193          insert_annotation(annotate_temp);
0194          annotate_pending := false;
0195       end else if nextsym^.name in [opencomment, closecomment] then begin
0196          { there's another comment already on the same line }
0197          if annotate_trace in traceFlags then
0198             writeln( infilename,' line: ', inlines, ' annotate ', keyword[annotate_temp], ' abandoned' );
0199          annotate_pending := false;
0200       end
0201       else if (nextsym^.name <> semicolon) then begin
0202          insert_annotation(annotate_temp);
0203          annotate_pending := false;
0204       end;
0205    end;
0206 
0207    if annotate_pending_tok then begin
0208       if nextsym^.crsbefore > 0 then begin
0209          { rest of line is empty }
0210          insert_annotation_tok( annotate_temp_tok );
0211          annotate_pending_tok := false;
0212       end
0213       else if nextsym^.name in [opencomment, closecomment] then begin
0214          { there's another comment already on the same line }
0215          if annotate_trace in traceFlags then
0216             writeln( infilename,
0217                      ' line: ', inlines,
0218                      ' annotate ', annotate_temp_tok.val:annotate_temp_tok.len, ' abandoned'
0219                    );
0220          annotate_pending_tok := false;
0221       end
0222       else if not (nextsym^.name in [semicolon, period]) then begin
0223          insert_annotation_tok( annotate_temp_tok );
0224          annotate_pending_tok := false;
0225       end;
0226    end;
0227 end; { f1 }
0228 
0229 
0230 function f2( p: boolean;
0231              var q: real;
0232              var x: ttype;              // should line up with first param
0233              var c: char;
0234 
0235              var i1, i2: integer;
0236 
0237              ch: char;
0238              z: boolean
0239            ) : real;
0240 
0241 var
0242    a: integer;
0243    b: boolean;
0244 
0245 begin { f2 }
0246 
0247    with floodlePtr^ do
0248      begin name := '        '; id := nil; next := nil; floodleAddr := 0;
0249       cow := grass + floodle  // should be indented
0250      end;
0251 
0252    case e of
0253       1: s1;   // CHECK: cr here should go to new case value!
0254       88:
0255          s3;
0256 
0257       2:  begin
0258           s2;
0259           s3;
0260          end;
0261 
0262       3: s3;
0263       4,5,6..9: s6;
0264 
0265       otherwise
0266          writeln('lots');
0267          writeln(' and lots');
0268    end; {case}
0269 
0270    if c then begin
0271       s1;
0272       a := func( 12,
0273                  fffff( 89,
0274                         t
0275                       ),
0276                  a // should align with '12'
0277                );
0278    end; // this must be aligned to the 'if' statement
0279 
0280 
0281    fredzarmplezzzzzzzzzzzz(       arg1,
0282                                   arg1,
0283                                   arg2,
0284                                   arg3
0285                           );
0286 
0287    x := f(a) + f(b);
0288 
0289 
0290    if (e111) + e2 then fffffffffffff(    func0(  func1(    func2( f3(       arg1,
0291 
0292 
0293                                                                             arg2,
0294                                                                             arg3,
0295                                                                             arg4
0296                                                                     ),
0297 
0298 
0299                                                                   a1,  // should be aligned with arg f3, not '('
0300                                                                   a2,
0301                                                                   a3,
0302                                                                   a4
0303                                                                 ),
0304 
0305                                                            aa2,
0306                                                            aa3,
0307                                                            aa4,
0308                                                            aa5
0309                                                       ),
0310                                                  bb1,
0311                                                  bb2,
0312                                                  bb3,
0313                                                  bb4
0314                                               ),
0315                                          cc1,
0316                                          cc2,
0317                                          cc3,
0318                                          cc4
0319                                     )
0320    else if c1 then begin
0321       s1;
0322    end;
0323 
0324    nextStmt := 13;
0325 
0326    while c1 do
0327       if q then
0328          s1
0329       else if qq then begin
0330          s2;
0331          s3
0332       end;
0333 
0334 
0335    if c1
0336          and c2 then begin // this can be aligned manually
0337       a := 12;
0338       s1;
0339       f(x)
0340    end;
0341 
0342    if cc1 then
0343       while c2 do
0344          f(x);
0345 
0346    while c1 do f(  arg1,
0347                    arg2  // this should line up with arg1
0348                 );
0349 
0350    if c4 then f( arg1,
0351                  arg2
0352                );
0353 
0354    f1        ( arg1,
0355                arg2
0356              );
0357    fred      (  arg1,
0358                 arg2
0359                 arg3
0360                 arg4,
0361 
0362                 arg5
0363              );
0364 
0365    ff( arg1,
0366        arg2
0367      );
0368 
0369    a[1] := 13;
0370    repeat
0371       s1;
0372       while c3 do begin
0373          s3;
0374          while c2 do begin
0375             s4;
0376             while c4 do begin
0377                if c3 then
0378                  begin
0379                   s1;
0380                   s2;
0381                  end else
0382                     s3;
0383                if c3 then begin
0384                   s1
0385                end else
0386 
0387                   if a then b
0388                   else
0389                      if c then d
0390                      else
0391 
0392                         s2;
0393                if c3 then
0394                   if c4 then
0395                      s5;
0396 
0397                s3
0398             end;
0399          end
0400       end
0401    until c3;
0402 
0403 
0404    s5;
0405 
0406    s3;
0407    while c7 do begin
0408       s3;
0409       s4
0410    end;
0411 
0412    s4
0413 end;
0414 
0415 s2
0416 until c1;  // there is no matching repeat here
0417 
0418 end;  { f2 }