pastojs: filer: store canonical class-of

This commit is contained in:
mattias 2019-10-30 08:23:12 +00:00
parent 598d4e8ba7
commit a59e387074

View File

@ -690,6 +690,7 @@ type
procedure AddReferenceToArray(Arr: TJSONArray; El: TPasElement; WriteNull: boolean = true); virtual;
procedure AddReferenceToObj(Obj: TJSONObject; const PropName: string;
El: TPasElement; WriteNil: boolean = false); virtual;
procedure CreateAutoElReferenceId(Ref: TPCUFilerElementRef); virtual;
procedure CreateElReferenceId(Ref: TPCUFilerElementRef); virtual;
function CreateElementRef(El: TPasElement): TPCUFilerElementRef; override;
procedure AddedBuiltInRef(Ref: TPCUFilerElementRef); override;
@ -2058,12 +2059,17 @@ begin
end;
end;
procedure TPCUWriter.CreateElReferenceId(Ref: TPCUFilerElementRef);
procedure TPCUWriter.CreateAutoElReferenceId(Ref: TPCUFilerElementRef);
begin
if Ref.Id<>0 then
RaiseMsg(20180207114300,Ref.Element,IntToStr(Ref.Id));
inc(FElementIdCounter);
Ref.Id:=FElementIdCounter;
end;
procedure TPCUWriter.CreateElReferenceId(Ref: TPCUFilerElementRef);
begin
CreateAutoElReferenceId(Ref);
Ref.Obj.Add('Id',Ref.Id);
end;
@ -3426,6 +3432,7 @@ var
ScopeIntf: TFPList;
o: TObject;
SubObj: TJSONObject;
Ref: TPCUFilerElementRef;
begin
WriteIdentifierScope(Obj,Scope,aContext);
aClass:=Scope.Element as TPasClassType;
@ -3447,6 +3454,10 @@ begin
RaiseMsg(20180217143857,aClass);
if CanonicalClassOf.SourceLinenumber<>aClass.SourceLinenumber then
RaiseMsg(20180217143905,aClass);
Ref:=GetElementReference(CanonicalClassOf);
CreateAutoElReferenceId(Ref);
Obj.Add('ClassOf',Ref.Id);
ResolvePendingElRefs(Ref);
end
else if CanonicalClassOf<>nil then
RaiseMsg(20180329110817,aClass,GetObjName(CanonicalClassOf));
@ -6931,10 +6942,11 @@ procedure TPCUReader.ReadClassScope(Obj: TJSONObject; Scope: TPas2JSClassScope;
var
aClass: TPasClassType;
CanonicalClassOf: TPasClassOfType;
CanonicalClassOfId: integer;
begin
aClass:=Scope.Element as TPasClassType;
if aClass.ObjKind=okClass then
if aClass.ObjKind in ([okClass]+okAllHelpers) then
begin
CanonicalClassOf:=TPasClassOfType(CreateElement(TPasClassOfType,'Self',aClass));
Scope.CanonicalClassOf:=CanonicalClassOf;
@ -6943,6 +6955,8 @@ begin
CanonicalClassOf.SourceLinenumber:=aClass.SourceLinenumber;
CanonicalClassOf.DestType:=aClass;
aClass.AddRef{$IFDEF CheckPasTreeRefCount}('TPasClassScope.CanonicalClassOf'){$ENDIF};
if ReadInteger(Obj,'ClassOf',CanonicalClassOfId,CanonicalClassOf) then
AddElReference(CanonicalClassOfId,CanonicalClassOf,CanonicalClassOf);
end;
ReadElementReference(Obj,Scope,'NewInstanceFunction',@Set_ClassScope_NewInstanceFunction);