codetools: auto resolving auto generated name conflicts

git-svn-id: trunk@14563 -
This commit is contained in:
mattias 2008-03-18 10:29:09 +00:00
parent 4358448ef7
commit c592a2172d
2 changed files with 56 additions and 21 deletions

View File

@ -18,6 +18,11 @@ extern "C" {
#define constant 1
#define macro1 1
// empty macro
#define MPI_FILE_DEFINED
// null pointer
#define MPI_BOTTOM (void *)0
/* An anonymous enum */
enum {
TEST_ENUM1 = 1, /* Enum starts at 1 */

View File

@ -110,8 +110,11 @@ type
UseSingleIdentifierAsDefault: boolean): string;
function CreateH2PNode(const PascalName, CName: string; CNode: TCodeTreeNode;
PascalDesc: TCodeTreeNodeDesc; ParentNode: TH2PNode = nil;
IsGlobal: boolean = true): TH2PNode;
PascalDesc: TCodeTreeNodeDesc; const PascalCode: string;
ParentNode: TH2PNode = nil; IsGlobal: boolean = true): TH2PNode;
function CreateAutoGeneratedH2PNode(var PascalName: string; CNode: TCodeTreeNode;
PascalDesc: TCodeTreeNodeDesc; const PascalCode: string;
ParentNode: TH2PNode = nil; IsGlobal: boolean = true): TH2PNode;
function GetTypeForVarType(CVarNode: TCodeTreeNode;
CreateIfNotExists: boolean = true): TH2PNode;
function CreatePascalNameFromCCode(const CCode: string;
@ -297,8 +300,7 @@ begin
SimpleType:=TypeH2PNode.PascalName;
end;
if SimpleType<>'' then begin
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition);
H2PNode.PascalCode:=SimpleType;
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,SimpleType);
DebugLn(['TH2PasTool.BuildH2PTree added: ',H2PNode.DescAsString]);
end else begin
DebugLn(['TH2PasTool.BuildH2PTree invalid Variable Name="',CurName,'" Type="',CurType,'"']);
@ -392,14 +394,16 @@ begin
end;
function TH2PasTool.CreateH2PNode(const PascalName, CName: string;
CNode: TCodeTreeNode; PascalDesc: TCodeTreeNodeDesc; ParentNode: TH2PNode;
IsGlobal: boolean): TH2PNode;
CNode: TCodeTreeNode; PascalDesc: TCodeTreeNodeDesc;
const PascalCode: string;
ParentNode: TH2PNode; IsGlobal: boolean): TH2PNode;
begin
Result:=TH2PNode.Create;
Result.PascalName:=PascalName;
Result.CName:=CName;
Result.CNode:=CNode;
Result.PascalDesc:=PascalDesc;
Result.PascalCode:=PascalCode;
Tree.AddNodeAsLastChild(ParentNode,Result);
if IsGlobal then begin
FPascalNames.Add(Result);
@ -407,6 +411,39 @@ begin
end;
end;
function TH2PasTool.CreateAutoGeneratedH2PNode(var PascalName: string;
CNode: TCodeTreeNode; PascalDesc: TCodeTreeNodeDesc;
const PascalCode: string;
ParentNode: TH2PNode;
IsGlobal: boolean): TH2PNode;
function Check(const TestName: string; out Node: TH2PNode): boolean;
begin
Node:=FindH2PNodeWithPascalName(TestName);
if (Node=nil) then begin
Node:=CreateH2PNode(TestName,'',CNode,PascalDesc,PascalCode);
Result:=true;
end else if ((Node.CNode=CNode) and (Node.PascalDesc=PascalDesc)
and (Node.PascalCode=PascalCode)
and (Node.Parent=ParentNode))
then begin
Result:=true;
end else begin
Result:=false;
Node:=nil;
end;
end;
var
i: Integer;
begin
Result:=nil;
if Check(PascalName,Result) then exit;
i:=1;
while not Check(PascalName+'_'+IntToStr(i),Result) do
inc(i);
end;
function TH2PasTool.GetTypeForVarType(CVarNode: TCodeTreeNode;
CreateIfNotExists: boolean): TH2PNode;
var
@ -476,13 +513,10 @@ begin
end else begin
// a new pointer type is needed
NewBasePascalType:='P'+BasePascalType;
SubH2PNode:=FindH2PNodeWithPascalName(NewBasePascalType);
if SubH2PNode=nil then begin
SubH2PNode:=CreateH2PNode(NewBasePascalType,NewBasePascalType,nil,
ctnTypeDefinition);
SubH2PNode.PascalCode:='^'+BasePascalType;
DebugLn(['TH2PasTool.GetTypeForVarType added new pointer type: ',SubH2PNode.DescAsString]);
end;
SubH2PNode:=CreateAutoGeneratedH2PNode(NewBasePascalType,nil,
ctnTypeDefinition,'^'+BasePascalType);
DebugLn(['TH2PasTool.GetTypeForVarType added new pointer type: ',SubH2PNode.DescAsString]);
NewBasePascalType:=SubH2PNode.PascalName;
end;
BasePascalType:=NewBasePascalType;
DebugLn(['TH2PasTool.GetTypeForVarType using pointer type: BasePascalType="',BasePascalType,'" BaseCType="',BaseCType,'"']);
@ -514,7 +548,7 @@ begin
// [] -> open array
PascalCode:='array of '+PascalCode;
PascalName:='ArrayOf'+PascalName;
DebugLn(['TH2PasTool.GetTypeForVarType open array: ',PascalCode]);
//DebugLn(['TH2PasTool.GetTypeForVarType open array: ',PascalCode]);
end else begin
// [constant] -> array[0..constant-1]
ConstantStartPos:=AtomStart;
@ -522,7 +556,7 @@ begin
ReadTilCBracketClose(CCode,p);
ConstantEndPos:=p-1;
ConstantCode:=copy(CCode,ConstantStartPos,ConstantEndPos-ConstantStartPos);
DebugLn(['TH2PasTool.GetTypeForVarType ConstantCode="',ConstantCode,'"']);
//DebugLn(['TH2PasTool.GetTypeForVarType ConstantCode="',ConstantCode,'"']);
if CConstantToInt64(ConstantCode,ConstantNumber) then begin
if ConstantNumber>0 then
dec(ConstantNumber)
@ -534,7 +568,7 @@ begin
end;
PascalCode:='array[0..'+ConstantCode+'] of '+PascalCode;
PascalName:='Array_0to'+CreatePascalNameFromCCode(ConstantCode)+'_Of'+PascalName;
DebugLn(['TH2PasTool.GetTypeForVarType fixed array: ',PascalCode]);
//DebugLn(['TH2PasTool.GetTypeForVarType fixed array: ',PascalCode]);
end;
end else
break;
@ -543,11 +577,7 @@ begin
if NeedH2PNode then begin
PascalName:='T'+PascalName;
PascalName:=copy(PascalName,1,DefaultMaxPascalIdentLen);
SubH2PNode:=FindH2PNodeWithPascalName(PascalName);
if SubH2PNode=nil then begin
SubH2PNode:=CreateH2PNode(PascalName,PascalName,nil,ctnTypeDefinition);
SubH2PNode.PascalCode:=PascalCode;
end;
SubH2PNode:=CreateAutoGeneratedH2PNode(PascalName,nil,ctnTypeDefinition,PascalCode);
end;
// check if the whole declaration was translated