From e318185d27ce84844e9371b77c507b052aebc660 Mon Sep 17 00:00:00 2001 From: yury Date: Tue, 25 Nov 2014 17:40:07 +0000 Subject: [PATCH] * pas2jni: Properly handle indexed properties with more than one index parameters. git-svn-id: trunk@29147 - --- utils/pas2jni/def.pas | 1 - utils/pas2jni/ppuparser.pas | 4 +-- utils/pas2jni/writer.pas | 64 ++++++++++++++++++++++++++----------- 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/utils/pas2jni/def.pas b/utils/pas2jni/def.pas index bf1997cca0..8edde31b3b 100644 --- a/utils/pas2jni/def.pas +++ b/utils/pas2jni/def.pas @@ -138,7 +138,6 @@ type public VarOpt: TVarOptions; VarType: TDef; - IndexType: TDef; constructor Create; override; procedure ResolveDefs; override; function IsReplacedBy(d: TReplDef): boolean; override; diff --git a/utils/pas2jni/ppuparser.pas b/utils/pas2jni/ppuparser.pas index 73af9334fc..cf0d438276 100644 --- a/utils/pas2jni/ppuparser.pas +++ b/utils/pas2jni/ppuparser.pas @@ -520,9 +520,7 @@ var if it.Get('Setter', TJSONObject(nil)) <> nil then VarOpt:=VarOpt + [voWrite]; - arr:=it.Get('Params', TJSONArray(nil)); - if (arr <> nil) and (arr.Count = 1) then - IndexType:=_GetRef(arr.Objects[0].Objects['VarType']); + _ReadDefs(d, it, 'Params'); end; dtEnum: _ReadDefs(d, it, 'Elements'); diff --git a/utils/pas2jni/writer.pas b/utils/pas2jni/writer.pas index 326e2810c3..ccad1ae4f0 100644 --- a/utils/pas2jni/writer.pas +++ b/utils/pas2jni/writer.pas @@ -793,10 +793,16 @@ begin s:='__objvar.'; end; s:=s + Variable.Name; - if Variable.IndexType <> nil then begin + if Variable.Count > 0 then begin ASSERT(Count >= 1); - i:=1; - s:=Format('%s[%s]', [s, JniToPasType(TVarDef(Items[0]).VarType, Items[0].Name, False)]); + i:=Variable.Count; + ss:=''; + for j:=0 to Variable.Count - 1 do begin + if ss <> '' then + ss:=ss + ', '; + ss:=ss + JniToPasType(TVarDef(Items[j]).VarType, Items[j].Name, False); + end; + s:=Format('%s[%s]', [s, ss]); end else i:=0; @@ -899,8 +905,10 @@ end; procedure TWriter.WriteVar(d: TVarDef; AParent: TDef); var pd: TProcDef; + vd: TVarDef; t: TTypeDef; s: string; + i: integer; begin if not d.IsUsed then exit; @@ -914,7 +922,7 @@ begin s:=''; end; s:=Trim(s + ' ' + d.Name); - if d.IndexType <> nil then + if d.Count > 0 then s:=s + '[]'; Fjs.WriteLn(Format('// %s: %s', [s, d.VarType.Name])); end; @@ -927,13 +935,16 @@ begin pd.ProcType:=ptFunction; pd.Name:='get' + d.Name; pd.ReturnType:=d.VarType; - if d.IndexType <> nil then - with TVarDef.Create(pd, dtParam) do begin - Name:='_Index'; - AliasName:='Index'; - VarType:=d.IndexType; - VarOpt:=[voRead]; + if d.DefType = dtProp then begin + for i:=0 to d.Count - 1 do begin + vd:=TVarDef(d.Items[i]); + with TVarDef.Create(pd, dtParam) do begin + Name:=vd.Name; + VarType:=vd.VarType; + VarOpt:=[voRead]; + end; end; + end; WriteProc(pd, d, AParent); finally pd.Free; @@ -947,16 +958,33 @@ begin pd.Parent:=d.Parent; pd.ProcType:=ptProcedure; pd.Name:='set' + d.Name; - if d.IndexType <> nil then - with TVarDef.Create(pd, dtParam) do begin - Name:='_Index'; - AliasName:='Index'; - VarType:=d.IndexType; - VarOpt:=[voRead]; + + s:='Value'; + if d.DefType = dtProp then begin + for i:=0 to d.Count - 1 do begin + vd:=TVarDef(d.Items[i]); + with TVarDef.Create(pd, dtParam) do begin + Name:=vd.Name; + VarType:=vd.VarType; + VarOpt:=[voRead]; + end; end; + + // Check if the name of value parameter is unique + i:=0; + while i < d.Count do begin + if AnsiCompareText(s, d.Items[i].Name) = 0 then begin + i:=0; + s:='_' + s; + continue; + end; + Inc(i); + end; + end; + with TVarDef.Create(pd, dtParam) do begin - Name:='_Value'; - AliasName:='Value'; + Name:='_' + s; + AliasName:=s; VarType:=d.VarType; VarOpt:=[voRead]; end;