Generator :

* unit without types should not have a "type" section
  * alias definitions should occurs according to their dependency on each other

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2841 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2013-11-19 14:37:07 +00:00
parent 0a2294b0d7
commit 29fbe0a4b9

View File

@ -171,7 +171,7 @@ type
private
function GenerateIntfName(AIntf : TPasElement):string;
procedure GenerateUnitHeader();
procedure GenerateUnitHeader(const AIncludeTypeSection : Boolean);
procedure GenerateUnitImplementationHeader();
procedure GenerateUnitImplementationFooter();
@ -2193,7 +2193,7 @@ begin
Result := AIntf.Name;//ExtractserviceName(AIntf);
end;
procedure TInftGenerator.GenerateUnitHeader();
procedure TInftGenerator.GenerateUnitHeader(const AIncludeTypeSection : Boolean);
var
s : string;
begin
@ -2228,9 +2228,11 @@ begin
Indent();WriteLn('sUNIT_NAME = %s;',[QuotedStr(FSymbolTable.CurrentModule.Name)]);
DecIndent();
if AIncludeTypeSection then begin
WriteLn('');
WriteLn('type');
WriteLn('');
end;
end;
procedure TInftGenerator.GenerateUnitImplementationHeader();
@ -2434,7 +2436,7 @@ var
procedure WritePropertyField(AProp : TPasProperty);
begin
Indent();
WriteLn('F%s : %s;',[AProp.Name,AProp.VarType.Name]);
WriteLn('F%s : %s;',[AProp.Name,FindActualType(AProp.VarType,SymbolTable).Name]);
End;
procedure WriteProperty(AProp : TPasProperty);
@ -2608,7 +2610,7 @@ var
if pte.InheritsFrom(TPasUnresolvedTypeRef) then
pte := SymbolTable.FindElement(SymbolTable.GetExternalName(pte));
pt := pte as TPasType;
pt := GetUltimeType(pt);
pt := GetUltimeType(pt,SymbolTable);
if pt.InheritsFrom(TPasEnumType) then begin
WriteLn('Result := True;');
end else if pt.InheritsFrom(TPasNativeSimpleType) and
@ -3074,6 +3076,36 @@ procedure TInftGenerator.InternalExecute();
end;
end;
procedure SortAlias(AList : TList2);
var
k, ki : Integer;
locElt : TPasElement;
locItem : TPasAliasType;
locTarget : TPasType;
begin
for k := 0 to Pred(AList.Count) do begin
locItem := TPasAliasType(AList[k]);
locTarget := locItem.DestType;
if (locTarget = nil) then
Continue;
if locTarget.InheritsFrom(TPasUnresolvedTypeRef) then begin
locElt := SymbolTable.FindElement(SymbolTable.GetExternalName(locTarget));
if (locElt = nil) or not(locElt.InheritsFrom(TPasType)) then
Continue;
locTarget := locElt as TPasType;
end;
if not locTarget.InheritsFrom(TPasAliasType) then
Continue;
for ki := (k+1) to Pred(AList.Count) do begin
if (TPasType(AList[ki]) = locTarget) then begin
AList.Delete(ki);
AList.Insert(k,locTarget);
Break;
end;
end;
end;
end;
var
i,c, j, k : PtrInt;
clssTyp : TPasClassType;
@ -3091,10 +3123,10 @@ begin
tmpList := nil;
gnrClssLst := TObjectList.Create(False);
try
GenerateUnitHeader();
GenerateUnitImplementationHeader();
typeList := SymbolTable.CurrentModule.InterfaceSection.Declarations;
c := Pred(typeList.Count);
GenerateUnitHeader(typeList.Count>0);
GenerateUnitImplementationHeader();
SetCurrentStream(FDecStream);
IncIndent();
@ -3140,13 +3172,20 @@ begin
for i := 0 to Pred(tmpList.Count) do begin
GenerateRecord(TPasRecordType(tmpList[i]));
end;
tmpList.Clear();
end;
tmpList.Clear();
for i := 0 to c do begin
elt := TPasElement(typeList[i]);
if elt.InheritsFrom(TPasAliasType) then begin
GenerateTypeAlias(TPasAliasType(elt));
if elt.InheritsFrom(TPasAliasType) then
tmpList.Add(elt);
end;
if (tmpList.Count > 0) then begin
SortAlias(tmpList);
for i := 0 to Pred(tmpList.Count) do
GenerateTypeAlias(TPasAliasType(tmpList[i]));
tmpList.Clear();
end;
objLst := TObjectList.Create();