mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 09:09:30 +02:00
pastojs: fixed class-of-aliastype
git-svn-id: trunk@37395 -
This commit is contained in:
parent
aa1eed7b20
commit
35f7b9fcf6
@ -1181,7 +1181,7 @@ type
|
||||
Function IsElementUsed(El: TPasElement): boolean; virtual;
|
||||
Function IsSystemUnit(aModule: TPasModule): boolean; virtual;
|
||||
Function HasTypeInfo(El: TPasType; AContext: TConvertContext): boolean; virtual;
|
||||
Function IsClassRTTICreatedBefore(aClass: TPasClassType; Before: TPasElement): boolean;
|
||||
Function IsClassRTTICreatedBefore(aClass: TPasClassType; Before: TPasElement; AConText: TConvertContext): boolean;
|
||||
Function CreateElement(C: TJSElementClass; Src: TPasElement): TJSElement; virtual;
|
||||
Function CreateFreeOrNewInstanceExpr(Ref: TResolvedReference;
|
||||
AContext : TConvertContext): TJSCallExpression; virtual;
|
||||
@ -4204,6 +4204,7 @@ var
|
||||
DotExpr: TJSDotMemberExpression;
|
||||
NotEl: TJSUnaryNotExpression;
|
||||
InOp: TJSRelationalExpressionIn;
|
||||
TypeEl: TPasType;
|
||||
begin
|
||||
{$IFDEF VerbosePas2JS}
|
||||
writeln('TPasToJSConverter.ConvertBinaryExpressionRes OpCode="',OpcodeStrings[El.OpCode],'" Left=',GetResolverResultDbg(LeftResolved),' Right=',GetResolverResultDbg(RightResolved));
|
||||
@ -4259,7 +4260,8 @@ begin
|
||||
begin
|
||||
// "A is class-of-type" -> "A is class"
|
||||
FreeAndNil(B);
|
||||
B:=CreateReferencePathExpr(TPasClassOfType(RightResolved.IdentEl).DestType,AContext);
|
||||
TypeEl:=AContext.Resolver.ResolveAliasType(TPasClassOfType(RightResolved.IdentEl).DestType);
|
||||
B:=CreateReferencePathExpr(TypeEl,AContext);
|
||||
end;
|
||||
if (RightResolved.TypeEl is TPasClassType) and TPasClassType(RightResolved.TypeEl).IsExternal then
|
||||
begin
|
||||
@ -5560,7 +5562,7 @@ var
|
||||
|
||||
Var
|
||||
ResolvedEl: TPasResolverResult;
|
||||
TypeEl: TPasType;
|
||||
TypeEl, DestType: TPasType;
|
||||
ClassScope: TPas2JSClassScope;
|
||||
B: TJSBracketMemberExpression;
|
||||
OldAccess: TCtxAccess;
|
||||
@ -5610,7 +5612,7 @@ begin
|
||||
ConvertIndexedProperty(TPasProperty(ResolvedEl.IdentEl),AContext)
|
||||
else if ResolvedEl.BaseType=btContext then
|
||||
begin
|
||||
TypeEl:=ResolvedEl.TypeEl;
|
||||
TypeEl:=AContext.Resolver.ResolveAliasType(ResolvedEl.TypeEl);
|
||||
if TypeEl.ClassType=TPasClassType then
|
||||
begin
|
||||
aClass:=TPasClassType(TypeEl);
|
||||
@ -5624,7 +5626,8 @@ begin
|
||||
else if TypeEl.ClassType=TPasClassOfType then
|
||||
begin
|
||||
// aClass[]
|
||||
ClassScope:=TPasClassOfType(TypeEl).DestType.CustomData as TPas2JSClassScope;
|
||||
DestType:=AContext.Resolver.ResolveAliasType(TPasClassOfType(TypeEl).DestType);
|
||||
ClassScope:=DestType.CustomData as TPas2JSClassScope;
|
||||
if ClassScope.DefaultProperty=nil then
|
||||
RaiseInconsistency(20170206180503);
|
||||
ConvertDefaultProperty(ResolvedEl,ClassScope.DefaultProperty);
|
||||
@ -8205,7 +8208,7 @@ begin
|
||||
Ref:=TResolvedReference(El.CustomData);
|
||||
aClass:=Ref.Declaration as TPasClassType;
|
||||
if not HasTypeInfo(aClass,AContext) then exit;
|
||||
if IsClassRTTICreatedBefore(aClass,El) then exit;
|
||||
if IsClassRTTICreatedBefore(aClass,El,AContext) then exit;
|
||||
// module.$rtti.$Class("classname");
|
||||
Result:=CreateRTTINewType(aClass,FBuiltInNames[pbifnRTTINewClass],true,AContext,ObjLit);
|
||||
if ObjLit<>nil then
|
||||
@ -8269,6 +8272,7 @@ var
|
||||
Call: TJSCallExpression;
|
||||
ok: Boolean;
|
||||
List: TJSStatementList;
|
||||
DestType: TPasType;
|
||||
begin
|
||||
Result:=nil;
|
||||
if not HasTypeInfo(El,AContext) then exit;
|
||||
@ -8279,15 +8283,16 @@ begin
|
||||
try
|
||||
Prop:=ObjLit.Elements.AddElement;
|
||||
Prop.Name:=TJSString(FBuiltInNames[pbivnRTTIClassRef_InstanceType]);
|
||||
Prop.Expr:=CreateTypeInfoRef(El.DestType,AContext,El);
|
||||
DestType:=AContext.Resolver.ResolveAliasType(El.DestType);
|
||||
Prop.Expr:=CreateTypeInfoRef(DestType,AContext,El);
|
||||
|
||||
if not IsClassRTTICreatedBefore(El.DestType as TPasClassType,El) then
|
||||
if not IsClassRTTICreatedBefore(DestType as TPasClassType,El,AContext) then
|
||||
begin
|
||||
// class rtti must be forward registered
|
||||
if not (AContext is TFunctionContext) then
|
||||
RaiseNotSupported(El,AContext,20170412102916);
|
||||
// prepend module.$rtti.$Class("classname");
|
||||
Call:=CreateRTTINewType(El.DestType,FBuiltInNames[pbifnRTTINewClass],true,AContext,ObjLit);
|
||||
Call:=CreateRTTINewType(DestType,FBuiltInNames[pbifnRTTINewClass],true,AContext,ObjLit);
|
||||
if ObjLit<>nil then
|
||||
RaiseInconsistency(20170412102654);
|
||||
List:=TJSStatementList(CreateElement(TJSStatementList,El));
|
||||
@ -10659,7 +10664,7 @@ begin
|
||||
end;
|
||||
|
||||
function TPasToJSConverter.IsClassRTTICreatedBefore(aClass: TPasClassType;
|
||||
Before: TPasElement): boolean;
|
||||
Before: TPasElement; AConText: TConvertContext): boolean;
|
||||
var
|
||||
Decls: TPasDeclarations;
|
||||
i: Integer;
|
||||
@ -10687,7 +10692,8 @@ begin
|
||||
end
|
||||
else if C=TPasClassOfType then
|
||||
begin
|
||||
if TPasClassOfType(T).DestType=aClass then exit(true);
|
||||
if AConText.Resolver.ResolveAliasType(TPasClassOfType(T).DestType)=aClass then
|
||||
exit(true);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user