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 private
function GenerateIntfName(AIntf : TPasElement):string; function GenerateIntfName(AIntf : TPasElement):string;
procedure GenerateUnitHeader(); procedure GenerateUnitHeader(const AIncludeTypeSection : Boolean);
procedure GenerateUnitImplementationHeader(); procedure GenerateUnitImplementationHeader();
procedure GenerateUnitImplementationFooter(); procedure GenerateUnitImplementationFooter();
@ -2193,7 +2193,7 @@ begin
Result := AIntf.Name;//ExtractserviceName(AIntf); Result := AIntf.Name;//ExtractserviceName(AIntf);
end; end;
procedure TInftGenerator.GenerateUnitHeader(); procedure TInftGenerator.GenerateUnitHeader(const AIncludeTypeSection : Boolean);
var var
s : string; s : string;
begin begin
@ -2227,10 +2227,12 @@ begin
Indent();WriteLn('sNAME_SPACE = %s;',[QuotedStr(SymbolTable.GetExternalName(FSymbolTable.CurrentModule))]); Indent();WriteLn('sNAME_SPACE = %s;',[QuotedStr(SymbolTable.GetExternalName(FSymbolTable.CurrentModule))]);
Indent();WriteLn('sUNIT_NAME = %s;',[QuotedStr(FSymbolTable.CurrentModule.Name)]); Indent();WriteLn('sUNIT_NAME = %s;',[QuotedStr(FSymbolTable.CurrentModule.Name)]);
DecIndent(); DecIndent();
WriteLn(''); if AIncludeTypeSection then begin
WriteLn('type'); WriteLn('');
WriteLn(''); WriteLn('type');
WriteLn('');
end;
end; end;
procedure TInftGenerator.GenerateUnitImplementationHeader(); procedure TInftGenerator.GenerateUnitImplementationHeader();
@ -2434,7 +2436,7 @@ var
procedure WritePropertyField(AProp : TPasProperty); procedure WritePropertyField(AProp : TPasProperty);
begin begin
Indent(); Indent();
WriteLn('F%s : %s;',[AProp.Name,AProp.VarType.Name]); WriteLn('F%s : %s;',[AProp.Name,FindActualType(AProp.VarType,SymbolTable).Name]);
End; End;
procedure WriteProperty(AProp : TPasProperty); procedure WriteProperty(AProp : TPasProperty);
@ -2608,7 +2610,7 @@ var
if pte.InheritsFrom(TPasUnresolvedTypeRef) then if pte.InheritsFrom(TPasUnresolvedTypeRef) then
pte := SymbolTable.FindElement(SymbolTable.GetExternalName(pte)); pte := SymbolTable.FindElement(SymbolTable.GetExternalName(pte));
pt := pte as TPasType; pt := pte as TPasType;
pt := GetUltimeType(pt); pt := GetUltimeType(pt,SymbolTable);
if pt.InheritsFrom(TPasEnumType) then begin if pt.InheritsFrom(TPasEnumType) then begin
WriteLn('Result := True;'); WriteLn('Result := True;');
end else if pt.InheritsFrom(TPasNativeSimpleType) and end else if pt.InheritsFrom(TPasNativeSimpleType) and
@ -3073,7 +3075,37 @@ procedure TInftGenerator.InternalExecute();
end; end;
end; end;
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 var
i,c, j, k : PtrInt; i,c, j, k : PtrInt;
clssTyp : TPasClassType; clssTyp : TPasClassType;
@ -3091,10 +3123,10 @@ begin
tmpList := nil; tmpList := nil;
gnrClssLst := TObjectList.Create(False); gnrClssLst := TObjectList.Create(False);
try try
GenerateUnitHeader();
GenerateUnitImplementationHeader();
typeList := SymbolTable.CurrentModule.InterfaceSection.Declarations; typeList := SymbolTable.CurrentModule.InterfaceSection.Declarations;
c := Pred(typeList.Count); c := Pred(typeList.Count);
GenerateUnitHeader(typeList.Count>0);
GenerateUnitImplementationHeader();
SetCurrentStream(FDecStream); SetCurrentStream(FDecStream);
IncIndent(); IncIndent();
@ -3140,13 +3172,20 @@ begin
for i := 0 to Pred(tmpList.Count) do begin for i := 0 to Pred(tmpList.Count) do begin
GenerateRecord(TPasRecordType(tmpList[i])); GenerateRecord(TPasRecordType(tmpList[i]));
end; end;
tmpList.Clear();
end; end;
tmpList.Clear();
for i := 0 to c do begin for i := 0 to c do begin
elt := TPasElement(typeList[i]); elt := TPasElement(typeList[i]);
if elt.InheritsFrom(TPasAliasType) then begin if elt.InheritsFrom(TPasAliasType) then
GenerateTypeAlias(TPasAliasType(elt)); tmpList.Add(elt);
end; end;
if (tmpList.Count > 0) then begin
SortAlias(tmpList);
for i := 0 to Pred(tmpList.Count) do
GenerateTypeAlias(TPasAliasType(tmpList[i]));
tmpList.Clear();
end; end;
objLst := TObjectList.Create(); objLst := TObjectList.Create();