File: changeparamlist.lpr

package info (click to toggle)
lazarus 1.6.2%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 172,444 kB
  • ctags: 124,173
  • sloc: pascal: 1,528,777; xml: 260,232; sh: 3,008; java: 603; makefile: 512; perl: 297; sql: 222; ansic: 137
file content (128 lines) | stat: -rw-r--r-- 4,860 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
{
 ***************************************************************************
 *                                                                         *
 *   This source is free software; you can redistribute it and/or modify   *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This code is distributed in the hope that it will be useful, but      *
 *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
 *   General Public License for more details.                              *
 *                                                                         *
 *   A copy of the GNU General Public License is available on the World    *
 *   Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also      *
 *   obtain it by writing to the Free Software Foundation,                 *
 *   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.        *
 *                                                                         *
 ***************************************************************************

  Author: Mattias Gaertner

  Abstract:
    Demonstration how to change the parameter list of a procedure and
    adapt all references.
}
program changeparamlist;

{$mode objfpc}{$H+}

uses
  Classes, SysUtils, contnrs, CodeCache, CodeToolManager, FileProcs, AVL_Tree, CodeAtom,
  SourceChanger, CodeTree, FindDeclarationTool, CTUnitGraph, ChangeDeclarationTool,
  ChangeParamList1;

const
  ConfigFilename = 'codetools.config';

var
  Filename: string;
  Code: TCodeBuffer;
  Tool: TCodeTool;

procedure ChangeProc(ProcName: string; var Changes: TObjectList);
var
  ProcNode: TCodeTreeNode;
  ProcPos: TCodeXYPosition;
  RefCache: TFindIdentifierReferenceCache;
  ListOfPCodeXYPosition: TFPList;
  TreeOfPCodeXYPosition: TAVLTree;
begin
  RefCache:=nil;
  ListOfPCodeXYPosition:=nil;
  TreeOfPCodeXYPosition:=CodeToolBoss.CreateTreeOfPCodeXYPosition;
  try
    if not CodeToolBoss.FindProcDeclaration(Code,ProcName,Tool,ProcNode) then
      raise Exception.Create('procedure '+ProcName+' not found in '+Filename);
    if not Tool.CleanPosToCaret(ProcNode.FirstChild.StartPos,ProcPos) then
      raise Exception.Create('Tool.CleanPosToCaret for ProcNode failed');
    debugln(['Proc at ',dbgs(ProcPos)]);

    if not CodeToolBoss.FindReferences(ProcPos.Code,ProcPos.X,ProcPos.Y,Code,
       true,ListOfPCodeXYPosition,RefCache)
    then
      raise Exception.Create('FindReferences failed for '+Code.Filename);

    CodeToolBoss.AddListToTreeOfPCodeXYPosition(ListOfPCodeXYPosition,
                                                TreeOfPCodeXYPosition,true,false);

    if not CodeToolBoss.ChangeParamList(ProcPos.Code,Changes,ProcPos,
       TreeOfPCodeXYPosition)
    then
      raise Exception.Create('ChangeParamList failed for '+Code.Filename);

  finally
    CodeToolBoss.FreeListOfPCodeXYPosition(ListOfPCodeXYPosition);
    CodeToolBoss.FreeTreeOfPCodeXYPosition(TreeOfPCodeXYPosition);
    RefCache.Free;
    Changes.Clear;
  end;
  // write the new source:
  writeln('-----------------------------------');
  writeln('New source:');
  writeln(Code.Source);
  writeln('-----------------------------------');
end;

var
  Changes: TObjectList;
begin
  CodeToolBoss.SimpleInit(ConfigFilename);

  // load the file
  Filename:='scanexamples/changeparamlist1.pas';
  Filename:=ExpandFileName(SetDirSeparators(Filename));
  Code:=CodeToolBoss.LoadFile(Filename,false,false);
  if Code=nil then
    raise Exception.Create('loading failed: '+Filename);

  Changes:=TObjectList.create(true);
  try
    // Test: add the first parameter to a procedure
    //Changes.Add(TChangeParamListItem.CreateInsertNewParam(0,'','p1','integer'));
    //ChangeProc('DoNoParams',Changes);

    // Test: add another parameter as first to a procedure
    //Changes.Add(TChangeParamListItem.CreateInsertNewParam(0,'','p2','integer'));
    //ChangeProc('DoOneParam(char)',Changes);

    // Test: add another parameter as last to a procedure
    //Changes.Add(TChangeParamListItem.CreateInsertNewParam(1,'','p3','integer'));
    //ChangeProc('DoOneParam(char)',Changes);

    // Test: insert another parameter between two procedure parameters
    Changes.Add(TChangeParamListItem.CreateInsertNewParam(1,'','p3','integer'));
    ChangeProc('DoTwoParams1(,word)',Changes);
  finally
    Changes.Free;
  end;


  // write the new source:
  writeln('-----------------------------------');
  writeln('New source:');
  writeln(Code.Source);
  writeln('-----------------------------------');
end.