mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-03 00:20:22 +02:00
codetools: h2p: implemented nested definitions
git-svn-id: trunk@14567 -
This commit is contained in:
parent
893c996a5e
commit
8972d10822
@ -102,7 +102,7 @@ type
|
||||
Tree: TH2PTree;
|
||||
CTool: TCCodeParserTool;
|
||||
function Convert(CCode, PascalCode: TCodeBuffer): boolean;
|
||||
procedure BuildH2PTree;
|
||||
procedure BuildH2PTree(ParentNode: TH2PNode = nil);
|
||||
|
||||
function GetSimplePascalTypeOfCVar(CVarNode: TCodeTreeNode): string;
|
||||
function GetSimplePascalResultTypeOfCFunction(CFuncNode: TCodeTreeNode): string;
|
||||
@ -273,7 +273,7 @@ begin
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
procedure TH2PasTool.BuildH2PTree;
|
||||
procedure TH2PasTool.BuildH2PTree(ParentNode: TH2PNode);
|
||||
var
|
||||
CNode: TCodeTreeNode;
|
||||
CurName: String;
|
||||
@ -284,9 +284,15 @@ var
|
||||
TypeH2PNode: TH2PNode;
|
||||
CurValue: String;
|
||||
begin
|
||||
Tree.Clear;
|
||||
CNode:=CTool.Tree.Root;
|
||||
//DebugLn(['TH2PasTool.BuildH2PTree ParentNode=',ParentNode.DescAsString]);
|
||||
if ParentNode<>nil then
|
||||
CNode:=ParentNode.CNode.FirstChild
|
||||
else begin
|
||||
Tree.Clear;
|
||||
CNode:=CTool.Tree.Root;
|
||||
end;
|
||||
while CNode<>nil do begin
|
||||
//DebugLn(['TH2PasTool.BuildH2PTree Current ParentNode=',ParentNode.DescAsString,' CNode=',CCNodeDescAsString(CNode.Desc)]);
|
||||
NextCNode:=CNode.NextSkipChilds;
|
||||
case CNode.Desc of
|
||||
ccnRoot, ccnExtern:
|
||||
@ -305,7 +311,8 @@ begin
|
||||
SimpleType:=TypeH2PNode.PascalName;
|
||||
end;
|
||||
if SimpleType<>'' then begin
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,SimpleType);
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition,SimpleType,
|
||||
ParentNode,ParentNode=nil);
|
||||
DebugLn(['TH2PasTool.BuildH2PTree added: ',H2PNode.DescAsString]);
|
||||
end else begin
|
||||
DebugLn(['TH2PasTool.BuildH2PTree invalid Variable Name="',CurName,'" Type="',CurType,'"']);
|
||||
@ -317,10 +324,12 @@ begin
|
||||
if CurName='' then begin
|
||||
// this is an anonymous enum block => auto generate a name
|
||||
CurName:=CreatePascalNameFromCCode(CTool.Src,CNode.StartPos,CNode.EndPos);
|
||||
TypeH2PNode:=CreateAutoGeneratedH2PNode(CurName,CNode,ctnEnumerationType,'');
|
||||
TypeH2PNode:=CreateAutoGeneratedH2PNode(CurName,CNode,ctnEnumerationType,'',
|
||||
ParentNode,ParentNode=nil);
|
||||
end else begin
|
||||
// this enum block has a name
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnEnumerationType,'');
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnEnumerationType,'',
|
||||
ParentNode,ParentNode=nil);
|
||||
end;
|
||||
DebugLn(['TH2PasTool.BuildH2PTree added: ',TypeH2PNode.DescAsString]);
|
||||
NextCNode:=CNode.NextSkipChilds;
|
||||
@ -330,7 +339,7 @@ begin
|
||||
CurName:=CTool.ExtractEnumIDName(CNode);
|
||||
CurValue:=CTool.ExtractEnumIDValue(CNode);
|
||||
H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnEnumIdentifier,CurValue,
|
||||
TypeH2PNode);
|
||||
TypeH2PNode,ParentNode=nil);
|
||||
DebugLn(['TH2PasTool.BuildH2PTree added: ',H2PNode.DescAsString]);
|
||||
end;
|
||||
CNode:=CNode.NextBrother;
|
||||
@ -342,12 +351,15 @@ begin
|
||||
if CurName='' then begin
|
||||
// this is an anonymous struct => auto generate a name
|
||||
CurName:=CreatePascalNameFromCCode(CTool.Src,CNode.StartPos,CNode.EndPos);
|
||||
TypeH2PNode:=CreateAutoGeneratedH2PNode(CurName,CNode,ctnRecordType,'');
|
||||
TypeH2PNode:=CreateAutoGeneratedH2PNode(CurName,CNode,ctnRecordType,'',
|
||||
ParentNode,ParentNode=nil);
|
||||
end else begin
|
||||
// this struct has a name
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnRecordType,'');
|
||||
TypeH2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnRecordType,'',
|
||||
ParentNode,ParentNode=nil);
|
||||
end;
|
||||
NextCNode:=CNode.Next;
|
||||
// build recursively
|
||||
BuildH2PTree(TypeH2PNode);
|
||||
end;
|
||||
ccnFunction:
|
||||
begin
|
||||
@ -361,6 +373,9 @@ begin
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
// next C node
|
||||
if (ParentNode<>nil) and (not ParentNode.CNode.HasAsChild(NextCNode)) then
|
||||
NextCNode:=nil;
|
||||
CNode:=NextCNode;
|
||||
end;
|
||||
end;
|
||||
@ -803,16 +818,21 @@ end;
|
||||
|
||||
function TH2PNode.DescAsString: string;
|
||||
begin
|
||||
Result:='PascalName="'+PascalName+'"';
|
||||
if PascalName<>CName then
|
||||
Result:=Result+' CName="'+CName+'"';
|
||||
Result:=Result+' PascalDesc="'+NodeDescriptionAsString(PascalDesc)+'"';
|
||||
if CNode<>nil then begin
|
||||
Result:=Result+' CNode='+CCNodeDescAsString(CNode.Desc);
|
||||
end else begin
|
||||
Result:=Result+' CNode=nil';
|
||||
if Self=nil then begin
|
||||
Result:='nil';
|
||||
exit;
|
||||
end;
|
||||
Result:=Result+' PascalCode="'+dbgstr(PascalCode)+'"';
|
||||
Result:='{PascalName="'+PascalName+'"';
|
||||
if PascalName<>CName then
|
||||
Result:=Result+',CName="'+CName+'"';
|
||||
Result:=Result+',PascalDesc="'+NodeDescriptionAsString(PascalDesc)+'"';
|
||||
if CNode<>nil then begin
|
||||
Result:=Result+',CNode='+CCNodeDescAsString(CNode.Desc);
|
||||
end else begin
|
||||
Result:=Result+', CNode=nil';
|
||||
end;
|
||||
Result:=Result+',PascalCode="'+dbgstr(PascalCode)+'"';
|
||||
Result:=Result+'}';
|
||||
end;
|
||||
|
||||
procedure TH2PNode.ConsistencyCheck;
|
||||
@ -895,6 +915,7 @@ end;
|
||||
|
||||
procedure TH2PTree.AddNodeAsLastChild(ParentNode, ANode: TH2PNode);
|
||||
begin
|
||||
if ParentNode=ANode then RaiseCatchableException('');
|
||||
ANode.Parent:=ParentNode;
|
||||
if Root=nil then begin
|
||||
// set as root
|
||||
|
Loading…
Reference in New Issue
Block a user