From 535542bc52bc05a13dd08ee1d22573db4a677da8 Mon Sep 17 00:00:00 2001 From: mattias Date: Mon, 17 Mar 2008 11:14:07 +0000 Subject: [PATCH] codetools: h2p: keeping ctool, creating var nodes git-svn-id: trunk@14552 - --- components/codetools/ccodeparsertool.pas | 2 +- components/codetools/examples/h2pastest.lpr | 3 +- components/codetools/h2pastool.pas | 54 +++++++++++++++------ 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/components/codetools/ccodeparsertool.pas b/components/codetools/ccodeparsertool.pas index 2fe15f2c99..3b848b6a8c 100644 --- a/components/codetools/ccodeparsertool.pas +++ b/components/codetools/ccodeparsertool.pas @@ -220,7 +220,7 @@ begin ccnName : Result:='name'; ccnFuncParamList : Result:='function param list'; ccnStatementBlock: Result:='statement block'; - else Result:='?'; + else Result:='?('+IntToStr(Desc)+')'; end; end; diff --git a/components/codetools/examples/h2pastest.lpr b/components/codetools/examples/h2pastest.lpr index ca1798a82b..1940cead1f 100644 --- a/components/codetools/examples/h2pastest.lpr +++ b/components/codetools/examples/h2pastest.lpr @@ -63,7 +63,8 @@ begin Tool:=TH2PasTool.Create; Tool.Convert(CCode,PasCode); - Tool.WriteDebugReport; + //Tool.WriteDebugReport; + Tool.WriteH2PNodeReport; Tool.Free; except on E: ECCodeParserException do begin diff --git a/components/codetools/h2pastool.pas b/components/codetools/h2pastool.pas index d45582d621..68a47a3fb7 100644 --- a/components/codetools/h2pastool.pas +++ b/components/codetools/h2pastool.pas @@ -105,11 +105,12 @@ type function GetSimplePascalResultTypeOfCFunction(CFuncNode: TCodeTreeNode): string; function ConvertSimpleCTypeToPascalType(CType: string): string; - function CreateH2PNode(const PascalName: string; CNode: TCodeTreeNode; + function CreateH2PNode(const PascalName, CName: string; CNode: TCodeTreeNode; PascalDesc: TCodeTreeNodeDesc; ParentNode: TH2PNode = nil; IsGlobal: boolean = true): TH2PNode; procedure WriteDebugReport; + procedure WriteH2PNodeReport; constructor Create; destructor Destroy; override; procedure Clear; @@ -238,18 +239,15 @@ end; function TH2PasTool.Convert(CCode, PascalCode: TCodeBuffer): boolean; begin Result:=false; - - CTool:=TCCodeParserTool.Create; - try - // pare C header file - CTool.Parse(CCode); - //CTool.WriteDebugReport; - BuildH2PTree; - finally - CTool.Free; - end; - + if CTool=nil then + CTool:=TCCodeParserTool.Create; + // pare C header file + CTool.Parse(CCode); + //CTool.WriteDebugReport; + + BuildH2PTree; + Result:=true; end; @@ -259,6 +257,7 @@ var CurName: String; CurType: String; SimpleType: String; + H2PNode: TH2PNode; begin Tree.Clear; CNode:=CTool.Tree.Root; @@ -275,7 +274,9 @@ begin //SimpleType:=CreateTypeForVarType(CNode); end; if SimpleType<>'' then begin - + H2PNode:=CreateH2PNode(CurName,CurName,CNode,ctnVarDefinition); + H2PNode.PascalCode:=SimpleType; + //DebugLn(['TH2PasTool.BuildH2PTree CNode.Desc=',CCNodeDescAsString(CNode.Desc),' ',H2PNode.DescAsString]); end; end; ccnEnumBlock: @@ -376,12 +377,13 @@ begin Result:=PredefinedCTypes[CType]; end; -function TH2PasTool.CreateH2PNode(const PascalName: string; +function TH2PasTool.CreateH2PNode(const PascalName, CName: string; CNode: TCodeTreeNode; PascalDesc: TCodeTreeNodeDesc; ParentNode: TH2PNode; IsGlobal: boolean): TH2PNode; begin Result:=TH2PNode.Create; Result.PascalName:=PascalName; + Result.CName:=CName; Result.CNode:=CNode; Result.PascalDesc:=PascalDesc; Tree.AddNodeAsLastChild(ParentNode,Result); @@ -396,6 +398,24 @@ begin DebugLn(['TH2PasTool.WriteDebugReport ']); if CTool<>nil then CTool.WriteDebugReport; + WriteH2PNodeReport; +end; + +procedure TH2PasTool.WriteH2PNodeReport; +var + Node: TH2PNode; +begin + if (Tree=nil) then begin + DebugLn(['TH2PasTool.WriteH2PNodeReport Tree=nil']); + end else if (Tree.Root=nil) then begin + DebugLn(['TH2PasTool.WriteH2PNodeReport Tree.Root=nil']); + end else begin + Node:=Tree.Root; + while Node<>nil do begin + DebugLn([GetIndentStr(Node.GetLevel*2),Node.DescAsString]); + Node:=Node.Next; + end; + end; end; constructor TH2PasTool.Create; @@ -413,6 +433,7 @@ begin FreeAndNil(Tree); FreeAndNil(FPascalNames); FreeAndNil(FCNames); + FreeAndNil(CTool); inherited Destroy; end; @@ -491,12 +512,15 @@ 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='+CNode.DescAsString; + Result:=Result+' CNode='+CCNodeDescAsString(CNode.Desc); end else begin Result:=Result+' CNode=nil'; end; + Result:=Result+' PascalCode="'+dbgstr(PascalCode)+'"'; end; procedure TH2PNode.ConsistencyCheck;