pastojs: fixed class-of-aliastype

git-svn-id: trunk@37395 -
This commit is contained in:
Mattias Gaertner 2017-10-04 14:46:02 +00:00
parent aa1eed7b20
commit 35f7b9fcf6

View File

@ -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;