git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@393 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2008-03-28 10:25:27 +00:00
parent 6318c1609c
commit 9b8390f12f

View File

@@ -122,6 +122,7 @@ begin
end; end;
end; end;
function IsMethodConstructor(cl: TClassDef; m: TClassMethodDef): Boolean; function IsMethodConstructor(cl: TClassDef; m: TClassMethodDef): Boolean;
var var
res : TResultTypeDef; res : TResultTypeDef;
@@ -237,6 +238,50 @@ begin
Result := '{$endif}'; Result := '{$endif}';
end; end;
procedure WriteOutCommentStr(const AComment, Prefix: AnsiString; Subs: TStrings);
var
i : Integer;
j : Integer;
k : Integer;
cmtln : AnsiString;
begin
i := 1;
while i <= length(AComment) do begin
// scan for multylined comments
cmtln := ScanTo(AComment, i, [#10, #13]);
if i < length(AComment) then begin
if (AComment[i] = #10) and (AComment[i+1] = #13) then inc(i)
else if (AComment[i] = #13) and (AComment[i+1] = #10) then inc(i);
end;
inc(i);
// break long comments into lines
j := 1;
while j <= length(cmtln) do begin
k := j;
inc(j, 80);
if j > length(cmtln) then j := length(cmtln);
ScanTo(cmtln, j, [#32, #10, #13, #9]);
subs.Add(Prefix + '// ' + Copy(cmtln, k, j - k));
inc(j);
end;
end;
end;
procedure WriteOutIfComment(Items: TList; Index: Integer; const Prefix: AnsiString; Subs: TStrings);
var
j : integer;
begin
if (Index < 0) or (Index >= Items.Count) then Exit;
j := Index;
while (j >= 0) and (TObject(Items[j]) is TComment) do dec(j);
inc(j);
for j := j to index do
//if TObject(Items[Index]) is TComment then
WriteOutCommentStr( TComment(Items[j])._Comment, Prefix, Subs);
end;
// clears empty precompile statements, like // clears empty precompile statements, like
// {$ifdef SOMETHING} // {$ifdef SOMETHING}
// {$endif} // {$endif}
@@ -283,7 +328,7 @@ begin
end; end;
// todo: remove Prefix param... // todo: remove Prefix param...
procedure WriteOutIfDefPrecompiler(prec: TPrecompiler; subs: TStrings; const Prefix: AnsiString); procedure WriteOutIfDefPrecompiler(prec: TPrecompiler; const Prefix: AnsiString; subs: TStrings);
var var
ppas : AnsiString; ppas : AnsiString;
isend : Boolean; isend : Boolean;
@@ -319,7 +364,7 @@ begin
subs.add(ss); subs.add(ss);
end; end;
end else if obj is TPrecompiler then begin end else if obj is TPrecompiler then begin
WriteOutIfDefPrecompiler(TPrecompiler(obj), subs, ' '); WriteOutIfDefPrecompiler(TPrecompiler(obj), ' ', subs);
end; end;
end; {of for} end; {of for}
subs.Add(''); subs.Add('');
@@ -336,15 +381,33 @@ end;
function GetPascalEnumValue(const Name, Param: AnsiString): AnsiString; function GetPascalEnumValue(const Name, Param: AnsiString): AnsiString;
begin begin
Result := Name; Result := Name;
if Param <> '' then Result := Result + ' = ' + Param; if Param <> '' then
Result := Result + ' = ' + Param
end;
function ReplaceStr(const sub, subrep, s: AnsiString): AnsiString;
var
i : Integer;
j : Integer;
begin
i := Pos(sub, s);
if i = 0 then begin
Result := s;
Exit;
end;
j := i + length(sub);
Result := Copy(s, 1, i - 1) + subrep + Copy(s, j, length(s) - j + 1);
end; end;
function GetPascalConstValue(const Vl: AnsiString): AnsiString; function GetPascalConstValue(const Vl: AnsiString): AnsiString;
begin begin
Result := vl; //todo: improve! check at h2pas
Result := ReplaceStr('<<', 'shl', vl);
Result := ReplaceStr('>>', 'shr', Result);
end; end;
procedure WriteOutEnumValues(enm: TEnumTypeDef; st: TStrings; const Prefix: AnsiString); procedure WriteOutEnumValues(enm: TEnumTypeDef; const Prefix: AnsiString; st: TStrings);
var var
vl : TEnumValue; vl : TEnumValue;
s : AnsiString; s : AnsiString;
@@ -352,7 +415,7 @@ var
j : Integer; j : Integer;
begin begin
j := st.Count; j := st.Count;
for i := 0 to enm.Items.Count - 1 do for i := 0 to enm.Items.Count - 1 do begin
if TObject(enm.Items[i]) is TEnumValue then begin if TObject(enm.Items[i]) is TEnumValue then begin
vl := TEnumValue(enm.Items[i]); vl := TEnumValue(enm.Items[i]);
if st.Count > j then st[st.Count-1]:=st[st.Count-1]+', '; if st.Count > j then st[st.Count-1]:=st[st.Count-1]+', ';
@@ -361,6 +424,7 @@ begin
st.Add(s); st.Add(s);
end; end;
end; end;
end;
function Min(a, b: Integer): Integer; function Min(a, b: Integer): Integer;
begin begin
@@ -384,15 +448,12 @@ begin
pi := length(postfix); pi := length(postfix);
for i := 1 to Min(length(Name), length(postfix)) do begin for i := 1 to Min(length(Name), length(postfix)) do begin
if Name[ni] <> postfix[pi] then begin // this cause a bug if Name[ni] <> postfix[pi] then begin // this cause a bug
//writeln('postfix ', ni + 1, ' ', length(Name) - ni);
postfix := Copy(Name, ni + 1, length(Name) - ni); postfix := Copy(Name, ni + 1, length(Name) - ni);
// writeln('postfixing: ', postfix);
Break; Break;
end; end;
dec(ni); dec(ni);
dec(pi); dec(pi);
end; end;
end; end;
function EvaluateEnumName(enm: TEnumTypeDef): AnsiString; function EvaluateEnumName(enm: TEnumTypeDef): AnsiString;
@@ -404,6 +465,7 @@ var
i : Integer; i : Integer;
begin begin
known := 0; known := 0;
Result := '';
for i := 0 to enm.Items.Count - 1 do begin for i := 0 to enm.Items.Count - 1 do begin
if TObject(enm.Items[i]) is TEnumValue then begin if TObject(enm.Items[i]) is TEnumValue then begin
vl := TEnumValue(enm.Items[i]); vl := TEnumValue(enm.Items[i]);
@@ -412,7 +474,6 @@ begin
postfix := vl._Name; postfix := vl._Name;
end else end else
MatchFixes(vl._Name, prefix, postfix); MatchFixes(vl._Name, prefix, postfix);
//writeln(vl._Name, ' "', prefix, '", "', postfix,'"');
inc(known) inc(known)
end; end;
end; end;
@@ -428,11 +489,16 @@ begin
if enm._Name = '' then s := EvaluateEnumName(enm) if enm._Name = '' then s := EvaluateEnumName(enm)
else s := enm._Name; else s := enm._Name;
st.Add(Format(' %s = (', [s] )); st.Add(Format(' %s = (', [s] ));
WriteOutEnumValues(enm, st, ' '); WriteOutEnumValues(enm, ' ', st );
st.Add(' );'); st.Add(' );');
st.Add(''); st.Add('');
end; end;
procedure WriteOutTypeDefToHeader(typedef: TTypeNameDef; const Prefix: AnsiString; subs: TStrings);
begin
subs.Add( Prefix + Format('%s = %s;', [typedef._TypeName, typedef._Inherited]));
end;
procedure WriteOutHeaderSection(hdr: TObjCHeader; st: TStrings); procedure WriteOutHeaderSection(hdr: TObjCHeader; st: TStrings);
var var
i : Integer; i : Integer;
@@ -440,6 +506,8 @@ var
subs : TStringList; subs : TStringList;
s : AnsiString; s : AnsiString;
consts : TStringList; consts : TStringList;
const
SpacePrefix = ' ';
begin begin
BeginSection(hdr._FileName, 'HEADER', st); BeginSection(hdr._FileName, 'HEADER', st);
subs := TStringList.Create; subs := TStringList.Create;
@@ -464,9 +532,12 @@ begin
for i := 0 to hdr.Items.Count - 1 do for i := 0 to hdr.Items.Count - 1 do
if Assigned(hdr.Items[i]) then begin if Assigned(hdr.Items[i]) then begin
if (TObject(hdr.Items[i]) is TEnumTypeDef) then begin if (TObject(hdr.Items[i]) is TEnumTypeDef) then begin
WriteOutIfComment(hdr.Items, i - 1, SpacePrefix, subs);
WriteOutEnumToHeader(TEnumTypeDef(hdr.Items[i]), subs); WriteOutEnumToHeader(TEnumTypeDef(hdr.Items[i]), subs);
end else if (TObject(hdr.Items[i]) is TPrecompiler) then begin end else if (TObject(hdr.Items[i]) is TPrecompiler) then begin
WriteOutIfDefPrecompiler(TPrecompiler(hdr.Items[i]), st, ' '); WriteOutIfDefPrecompiler(TPrecompiler(hdr.Items[i]), SpacePrefix, st);
end else if (TObject(hdr.Items[i]) is TTypeNameDef) then begin
WriteOutTypeDefToHeader(TTypeNameDef(hdr.Items[i]), SpacePrefix, subs);
end; end;
end; {of if} end; {of if}
@@ -524,12 +595,13 @@ begin
for j := 0 to cl.Items.Count - 1 do begin for j := 0 to cl.Items.Count - 1 do begin
obj := TObject(cl.Items[j]); obj := TObject(cl.Items[j]);
if obj is TClassMethodDef then begin if obj is TClassMethodDef then begin
WriteOutIfComment(cl.Items, j - 1, ' ', subs);
s := GetMethodStr(cl, TClassMethodDef(cl.Items[j]), false); s := GetMethodStr(cl, TClassMethodDef(cl.Items[j]), false);
i := mtds.IndexOf(TClassMethodDef(cl.Items[j])._Name); i := mtds.IndexOf(TClassMethodDef(cl.Items[j])._Name);
if Integer(mtds.Objects[i]) > 0 then s := s + ' overload;'; if Integer(mtds.Objects[i]) > 0 then s := s + ' overload;';
subs.Add(SpacePrefix + s); subs.Add(SpacePrefix + s);
end else if obj is TPrecompiler then begin end else if obj is TPrecompiler then begin
WriteOutIfDefPrecompiler(TPrecompiler(obj), subs, SpacePrefix); WriteOutIfDefPrecompiler(TPrecompiler(obj), SpacePrefix, subs);
end; end;
end; end;
finally finally
@@ -552,8 +624,10 @@ begin
subs := TStringList.Create; subs := TStringList.Create;
try try
for i := 0 to hdr.Items.Count - 1 do for i := 0 to hdr.Items.Count - 1 do
if Assigned(hdr.Items[i]) and (TObject(hdr.Items[i]) is TClassDef) then if Assigned(hdr.Items[i]) and (TObject(hdr.Items[i]) is TClassDef) then begin
WriteOutIfComment(hdr.Items, i - 1, ' ', subs);
WriteOutClassToClasses(TClassDef(hdr.Items[i]), subs); WriteOutClassToClasses(TClassDef(hdr.Items[i]), subs);
end;
if subs.Count > 0 then begin if subs.Count > 0 then begin
st.Add('type'); st.Add('type');
@@ -624,6 +698,7 @@ var
isConsts : Boolean; isConsts : Boolean;
typeName : AnsiString; typeName : AnsiString;
begin begin
typeName := '';
if not Assigned(mtd.Owner) or (not (TObject(mtd.Owner) is TClassDef)) then Exit; // method cannot be without owning class if not Assigned(mtd.Owner) or (not (TObject(mtd.Owner) is TClassDef)) then Exit; // method cannot be without owning class
cl := TClassDef(mtd.Owner); cl := TClassDef(mtd.Owner);
@@ -688,7 +763,7 @@ begin
if obj is TClassMethodDef then if obj is TClassMethodDef then
WriteOutMethodToImplementation ( TClassMethodDef(cl.Items[i]), subs) WriteOutMethodToImplementation ( TClassMethodDef(cl.Items[i]), subs)
else if obj is TPrecompiler then else if obj is TPrecompiler then
WriteOutIfDefPrecompiler( TPrecompiler(obj), subs, ''); WriteOutIfDefPrecompiler( TPrecompiler(obj), '', subs);
end; end;
end; end;
@@ -709,8 +784,66 @@ begin
end; end;
procedure WriteOutIncludeFile(hdr: TObjCHeader; st: TStrings); function AppleEnumType(items: TList; TypeDefIdx: Integer): Boolean;
var
EnumIdx : integer;
typedef : TTypeNameDef;
enumdef : TEnumTypeDef;
const
AppleInherit = 'NSUInteger';
begin begin
Result := false;
EnumIdx := TypeDefIdx - 1;
if (EnumIdx < 0) or (EnumIdx >= items.Count) then Exit;
if (TObject(items.Items[TypeDefIdx]) is TTypeNameDef) and
(TObject(items.Items[EnumIdx]) is TEnumTypeDef) then begin
typedef := TTypeNameDef(items.Items[TypeDefIdx]);
enumdef := TEnumTypeDef(items.Items[EnumIdx]);
end else
Exit;
if typedef._Inherited = AppleInherit then enumdef._Name := typedef._TypeName;
Result := true;
end;
procedure AppleHeaderFix(ent : TEntity);
var
i : Integer;
obj : TEntity;
begin
i := 0;
while i < ent.Items.Count do begin
obj := TEntity(ent.Items[i]);
if obj is TTypeNameDef then begin
if AppleEnumType(ent.Items, i) then
ent.Items.Delete(i)
else
inc(i);
end else
inc(i)
end;
for i := 0 to ent.Items.Count - 1 do
AppleHeaderFix( TEntity(ent.Items[i]));
end;
procedure WriteOutIncludeFile(hdr: TObjCHeader; st: TStrings);
var
i : integer;
cmt : TComment;
begin
if hdr.Items.Count <= 0 then Exit;
AppleHeaderFix(hdr);
// .inc header-comment is the first comment entity in .h file , if any
if TObject(hdr.Items[0]) is TComment then begin
cmt := TComment(hdr.Items[0]);
st.Add('(*' + cmt._Comment + '*)');
cmt.Free;
hdr.Items.Delete(0);
end;
WriteOutHeaderSection(hdr, st); WriteOutHeaderSection(hdr, st);
WriteOutClassesSection(hdr, st); WriteOutClassesSection(hdr, st);
WriteOutImplementationSection(hdr, st); WriteOutImplementationSection(hdr, st);