mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-01 22:00:20 +02:00
codetools: auto resolving auto generated name conflicts
git-svn-id: trunk@14563 -
This commit is contained in:
parent
4358448ef7
commit
c592a2172d
@ -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 */
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user