codetools: h2p: implemented nested definitions

git-svn-id: trunk@14567 -
This commit is contained in:
mattias 2008-03-18 11:57:20 +00:00
parent 893c996a5e
commit 8972d10822

View File

@ -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