diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index d4e159fb00..e41ab5ebf5 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -1890,8 +1890,8 @@ type // Name mangling Function GetOverloadName(El: TPasElement; AContext: TConvertContext): string; Function CanClashWithGlobal(El: TPasElement): boolean; - Function TransformVariableName(ErrorEl: TPasElement; Const AName: String; CheckGlobal: boolean; AContext : TConvertContext): String; virtual; - Function TransformVariableName(El: TPasElement; AContext : TConvertContext) : String; virtual; + Function TransformToJSName(ErrorEl: TPasElement; Const AName: String; CheckGlobal: boolean; AContext : TConvertContext): String; virtual; + Function TransformElToJSName(El: TPasElement; AContext : TConvertContext) : String; virtual; Function TransformModuleName(El: TPasModule; AddModulesPrefix: boolean; AContext : TConvertContext) : String; virtual; Function IsReservedWord(const aName: string; CheckGlobal: boolean): boolean; virtual; Function GetTypeInfoName(El: TPasType; AContext: TConvertContext; @@ -5017,8 +5017,14 @@ begin end; function TPas2JSResolver.CreateSpecializedTypeName(Item: TPRSpecializedItem): string; +var + C: TClass; begin - Result:=Item.GenericEl.Name+'$G'+IntToStr(Item.Index+1); + C:=Item.GenericEl.ClassType; + if (C=TPasProcedureType) or (C=TPasFunctionType) then + Result:=inherited CreateSpecializedTypeName(Item) + else + Result:=Item.GenericEl.Name+'$G'+IntToStr(Item.Index+1); end; procedure TPas2JSResolver.SpecializeGenericImpl( @@ -6739,26 +6745,34 @@ var GenEl: TPasElement; begin Data:=El.CustomData; - if Data is TPas2JSProcedureScope then + if Data is TPasGenericScope then begin - ProcScope:=TPas2JSProcedureScope(Data); - if ProcScope.SpecializedFromItem<>nil then + if Data is TPas2JSProcedureScope then begin - // specialized proc -> generic name + 's' + index - GenEl:=ProcScope.SpecializedFromItem.GenericEl; - GenScope:=TPas2JSProcedureScope(GenEl.CustomData); - Result:=GenScope.OverloadName; - if Result='' then - Result:=GenEl.Name+'$'; - Result:=Result+'s'+IntToStr(ProcScope.SpecializedFromItem.Index); + ProcScope:=TPas2JSProcedureScope(Data); + if ProcScope.SpecializedFromItem<>nil then + begin + // specialized proc -> generic name + 's' + index + GenEl:=ProcScope.SpecializedFromItem.GenericEl; + GenScope:=TPas2JSProcedureScope(GenEl.CustomData); + Result:=GenScope.OverloadName; + if Result='' then + Result:=GenEl.Name+'$'; + Result:=Result+'s'+IntToStr(ProcScope.SpecializedFromItem.Index); + end + else + begin + Result:=ProcScope.OverloadName; + if Result='' then + Result:=El.Name; + end; + exit; end - else + else if Data is TPas2JSProcTypeScope then begin - Result:=ProcScope.OverloadName; - if Result='' then - Result:=El.Name; + Result:=TPas2JSProcTypeScope(Data).JSName; + if Result<>'' then exit; end; - exit; end; Result:=El.Name; end; @@ -7792,7 +7806,7 @@ begin RaiseInconsistency(20170125191923,ClassOrRec); C:=CreateCallExpression(Ref.Element); try - ProcName:=TransformVariableName(Proc,AContext); + ProcName:=TransformElToJSName(Proc,AContext); if ClassOrRec.ClassType=TPasRecordType then begin // create "path.$new()" @@ -9193,7 +9207,7 @@ begin begin // e.g. "Something.aClassVar:=" -> "aClass.aClassVar:=" LeftJS:=CreateReferencePathExpr(RightRefDecl.Parent,AContext); - Result:=CreateDotNameExpr(El,LeftJS,TJSString(TransformVariableName(RightRefDecl,AContext))); + Result:=CreateDotNameExpr(El,LeftJS,TJSString(TransformElToJSName(RightRefDecl,AContext))); exit; end; @@ -9292,7 +9306,7 @@ end; function TPasToJSConverter.CreateIdentifierExpr(El: TPasElement; AContext: TConvertContext): TJSElement; begin - Result:=CreatePrimitiveDotExpr(TransformVariableName(El,AContext),El); + Result:=CreatePrimitiveDotExpr(TransformElToJSName(El,AContext),El); end; function TPasToJSConverter.CreateIdentifierExpr(AName: string; @@ -9300,7 +9314,7 @@ function TPasToJSConverter.CreateIdentifierExpr(AName: string; ): TJSElement; // CheckGlobal: check name clashes with global identifiers too begin - Result:=CreatePrimitiveDotExpr(TransformVariableName(PosEl,AName,CheckGlobal,AContext),PosEl); + Result:=CreatePrimitiveDotExpr(TransformToJSName(PosEl,AName,CheckGlobal,AContext),PosEl); end; function TPasToJSConverter.CreateSubDeclJSNameExpr(El: TPasElement; @@ -9327,7 +9341,7 @@ function TPasToJSConverter.CreateSubDeclNameExpr(El: TPasElement; var JSName: String; begin - JSName:=TransformVariableName(El,PasName,false,AContext); + JSName:=TransformToJSName(El,PasName,false,AContext); Result:=CreateSubDeclJSNameExpr(El,JSName,AContext,PosEl); end; @@ -9336,7 +9350,7 @@ function TPasToJSConverter.CreateSubDeclNameExpr(El: TPasElement; var JSName: String; begin - JSName:=TransformVariableName(El,AContext); + JSName:=TransformElToJSName(El,AContext); Result:=CreateSubDeclJSNameExpr(El,JSName,AContext,PosEl); end; @@ -9637,7 +9651,7 @@ begin begin // writing a class var -> aClass.VarName PathExpr:=CreateReferencePathExpr(Decl.Parent,AContext); - Result:=CreateDotNameExpr(El,PathExpr,TJSString(TransformVariableName(Decl,AContext))); + Result:=CreateDotNameExpr(El,PathExpr,TJSString(TransformElToJSName(Decl,AContext))); CallTypeSetter; exit; end @@ -9673,7 +9687,7 @@ begin Result:=Call; Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnGetResourcestring)]); Call.AddArg(CreatePrimitiveDotExpr(TransformModuleName(Decl.GetModule,true,AContext),El)); - Call.AddArg(CreateLiteralString(El,TransformVariableName(Decl,AContext))); + Call.AddArg(CreateLiteralString(El,TransformElToJSName(Decl,AContext))); exit; end else if aResolver.IsHelperMethod(Decl) @@ -9976,7 +9990,7 @@ function TPasToJSConverter.ConvertInheritedExpr(El: TInheritedExpr; end else FunName:=CreateReferencePath(AncestorClass,AContext,rpkPathAndName,true) - +'.'+TransformVariableName(AncestorProc,AContext); + +'.'+TransformElToJSName(AncestorProc,AContext); end else FunName:=CreateReferencePath(AncestorProc,AContext,rpkPathAndName,true); @@ -13709,7 +13723,7 @@ begin Call:=CreateCallExpression(PosEl); Call.Expr:=CreatePrimitiveDotExpr(FunName,PosEl); // parameter: "Create" - Call.AddArg(CreateLiteralString(PosEl,TransformVariableName(aConstructor,AContext))); + Call.AddArg(CreateLiteralString(PosEl,TransformElToJSName(aConstructor,AContext))); ThrowSt.A:=Call; if length(El.Params)>1 then begin @@ -14064,7 +14078,7 @@ begin PasVar:=Ref.Declaration as TPasVariable; Vars.Add(PasVar); ObjLitEl:=ObjLit.Elements.AddElement; - CurName:=TransformVariableName(PasVar,AContext); + CurName:=TransformElToJSName(PasVar,AContext); if CurName[1]='[' then begin if CurName[length(CurName)]=']' then @@ -14087,7 +14101,7 @@ begin if not IsElementUsed(PasVar) then continue; // missing instance field in constant -> add default value ObjLitEl:=ObjLit.Elements.AddElement; - ObjLitEl.Name:=TJSString(TransformVariableName(PasVar,AContext)); + ObjLitEl.Name:=TJSString(TransformElToJSName(PasVar,AContext)); ObjLitEl.Expr:=CreateValInit(PasVar.VarType,PasVar.Expr,PasVar,AContext); end; ok:=true; @@ -14245,7 +14259,7 @@ begin // create 'A: initvalue' Obj:=TObjectContext(AContext).JSElement as TJSObjectLiteral; ObjLit:=Obj.Elements.AddElement; - ObjLit.Name:=TJSString(TransformVariableName(El,AContext)); + ObjLit.Name:=TJSString(TransformElToJSName(El,AContext)); ObjLit.Expr:=CreateVarInit(El,AContext); end else if AContext.IsGlobal then @@ -14474,7 +14488,7 @@ Var end; // add element: name : { ... } Lit:=TJSObjectLiteral(ResStrVarEl.Init).Elements.AddElement; - Lit.Name:=TJSString(TransformVariableName(ResStr,AContext)); + Lit.Name:=TJSString(TransformElToJSName(ResStr,AContext)); ObjLit:=TJSObjectLiteral(CreateElement(TJSObjectLiteral,ResStr)); Lit.Expr:=ObjLit; // add sub element: org: value @@ -14694,7 +14708,7 @@ var if (Member.ClassType=TPasClassConstructor) or (Member.ClassType=TPasClassDestructor) then continue; - Arr.AddElement(CreateLiteralString(Member,TransformVariableName(Member,AContext))); + Arr.AddElement(CreateLiteralString(Member,TransformElToJSName(Member,AContext))); end; end; @@ -14792,7 +14806,7 @@ begin Call.AddArg(CreatePrimitiveDotExpr(OwnerName,El)); // add parameter: string constant '"classname"' - ArgEx := CreateLiteralString(El,TransformVariableName(El,AContext)); + ArgEx := CreateLiteralString(El,TransformElToJSName(El,AContext)); Call.AddArg(ArgEx); if El.ObjKind=okInterface then @@ -14930,7 +14944,7 @@ begin Proc:=TPasProcedure(P); if IsTObject and (C=TPasDestructor) then begin - DestructorName:=TransformVariableName(P,AContext); + DestructorName:=TransformElToJSName(P,AContext); if DestructorName<>'Destroy' then begin // add 'rtl.tObjectDestroy="destroy";' @@ -15176,14 +15190,14 @@ begin // add 'TypeName: {}' ParentObj:=TObjectContext(AContext).JSElement as TJSObjectLiteral; ObjLit:=ParentObj.Elements.AddElement; - ObjLit.Name:=TJSString(TransformVariableName(El,AContext)); + ObjLit.Name:=TJSString(TransformElToJSName(El,AContext)); ObjLit.Expr:=Obj; Result:=Obj; end else if El.Parent is TProcedureBody then begin // add 'var TypeName = {}' - VarSt:=CreateVarStatement(TransformVariableName(El,AContext),Obj,El); + VarSt:=CreateVarStatement(TransformElToJSName(El,AContext),Obj,El); if AContext.JSElement is TJSSourceElements then begin Src:=TJSSourceElements(AContext.JSElement); @@ -15205,7 +15219,7 @@ begin for i:=0 to El.Values.Count-1 do begin EnumValue:=TPasEnumValue(El.Values[i]); - JSName:=TJSString(TransformVariableName(EnumValue,AContext)); + JSName:=TJSString(TransformElToJSName(EnumValue,AContext)); // add "0":"value" ObjLit:=Obj.Elements.AddElement; ObjLit.Name:=TJSString(IntToStr(i)); @@ -16030,13 +16044,13 @@ begin // local/nested or anonymous function Result:=FS; if (El.Name<>'') and not IsClassConDestructor then - FD.Name:=TJSString(TransformVariableName(El,AContext)); + FD.Name:=TJSString(TransformElToJSName(El,AContext)); end; for n := 0 to El.ProcType.Args.Count - 1 do begin Arg:=TPasArgument(El.ProcType.Args[n]); - FD.Params.Add(TransformVariableName(Arg,AContext)); + FD.Params.Add(TransformElToJSName(Arg,AContext)); end; BodyPas:=ImplProc.Body; @@ -17015,7 +17029,7 @@ begin begin PasVar:=TPasVariable(Fields[i]); CurAssignSt:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El)); - VarName:=TransformVariableName(PasVar,AContext); + VarName:=TransformElToJSName(PasVar,AContext); CurAssignSt.LHS:=CreateMemberExpression([LocalVarName,VarName]); CurAssignSt.Expr:=CreateVarInit(PasVar,AContext); AddToSourceElements(Src,CurAssignSt); @@ -17103,7 +17117,7 @@ begin VarType:=PasVar.VarType; if aResolver<>nil then VarType:=aResolver.ResolveAliasType(VarType); - VarName:=TransformVariableName(PasVar,aContext); + VarName:=TransformElToJSName(PasVar,aContext); if VarType.ClassType=TPasRecordType then begin // record @@ -17202,7 +17216,7 @@ begin for i:=0 to Fields.Count-1 do begin PasVar:=TPasVariable(Fields[i]); - VarName:=TransformVariableName(PasVar,AContext); + VarName:=TransformElToJSName(PasVar,AContext); SrcExpr:=CreateMemberExpression([SrcParamName,VarName]); if aResolver<>nil then begin @@ -18024,7 +18038,7 @@ begin LitEl:=ObjLit.Elements.AddElement; LitEl.Name:=TJSString(List[i]); Proc:=TPasProcedure(List.Objects[i]); - LitEl.Expr:=CreateLiteralJSString(Proc,TJSString(TransformVariableName(Proc,FuncContext))); + LitEl.Expr:=CreateLiteralJSString(Proc,TJSString(TransformElToJSName(Proc,FuncContext))); end; end; @@ -18165,7 +18179,7 @@ begin else begin // create rtl.createCallback(target, "FunName") - FunName:=TransformVariableName(Proc,AContext); + FunName:=TransformElToJSName(Proc,AContext); Call.AddArg(CreateLiteralString(Expr,FunName)); end; @@ -18741,7 +18755,7 @@ begin Param:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,Arg)); TargetParams.Elements.AddElement.Expr:=Param; // add "argname" - ArgName:=TransformVariableName(Arg,Arg.Name,true,AContext); + ArgName:=TransformToJSName(Arg,Arg.Name,true,AContext); Param.Elements.AddElement.Expr:=CreateLiteralString(Arg,ArgName); Flags:=0; // add "argtype" @@ -18893,7 +18907,7 @@ begin if ConstrParent.HelperForType<>nil then aResolver.RaiseMsg(20190223220134,nXExpectedButYFound,sXExpectedButYFound, ['class method','helper method'],Expr); - aName:=TransformVariableName(aConstructor,aContext); + aName:=TransformElToJSName(aConstructor,aContext); if AttrArrayLit=nil then AttrArrayLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,PosEl)); @@ -19002,7 +19016,7 @@ begin // $r.addField Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTTILocal),GetBIName(pbifnRTTIAddField)]); // param "varname" - aName:=TransformVariableName(V,AContext); + aName:=TransformElToJSName(V,AContext); Call.AddArg(CreateLiteralString(V,aName)); // param typeinfo Call.AddArg(JSTypeInfo); @@ -19084,7 +19098,7 @@ begin Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTTILocal),GetBIName(pbifnRTTIAddMethod)]); // param "funname" - FunName:=TransformVariableName(Proc,AContext); + FunName:=TransformElToJSName(Proc,AContext); Call.AddArg(CreateLiteralString(Proc,FunName)); // param methodkind as number @@ -19149,7 +19163,7 @@ var function GetAccessorName(Decl: TPasElement): String; begin - Result:=TransformVariableName(Decl,AContext); + Result:=TransformElToJSName(Decl,AContext); end; procedure AddOption(const aName: String; JS: TJSElement); @@ -19189,7 +19203,7 @@ begin Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTTILocal),GetBIName(pbifnRTTIAddProperty)]); // param "propname" - PropName:=TransformVariableName(Prop,Prop.Name,false,AContext); + PropName:=TransformToJSName(Prop,Prop.Name,false,AContext); Call.AddArg(CreateLiteralString(Prop,PropName)); // add flags @@ -19562,22 +19576,22 @@ begin MemberEl:=TPasElement(Members[0]); if not SameText(MemberEl.Name,'D1') then RaiseInconsistency(20180415094721,PosEl); - PropEl.Name:=TJSString(TransformVariableName(MemberEl,AContext)); + PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); PropEl.Expr:=CreateLiteralHexNumber(PosEl,GUID.D1,8); // D2: 0x1234 PropEl:=Result.Elements.AddElement; MemberEl:=TPasElement(Members[1]); - PropEl.Name:=TJSString(TransformVariableName(MemberEl,AContext)); + PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); PropEl.Expr:=CreateLiteralHexNumber(PosEl,GUID.D2,4); // D3: 0x1234 PropEl:=Result.Elements.AddElement; MemberEl:=TPasElement(Members[2]); - PropEl.Name:=TJSString(TransformVariableName(MemberEl,AContext)); + PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); PropEl.Expr:=CreateLiteralHexNumber(PosEl,GUID.D3,4); // D4: [0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12] PropEl:=Result.Elements.AddElement; MemberEl:=TPasElement(Members[3]); - PropEl.Name:=TJSString(TransformVariableName(MemberEl,AContext)); + PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); ArrLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,PosEl)); PropEl.Expr:=ArrLit; for i:=0 to 7 do @@ -19904,9 +19918,9 @@ procedure TPasToJSConverter.AddClassSupportedInterfaces(El: TPasClassType; MapItem:=TObject(Map.Procs[i]); if not (MapItem is TPasProcedure) then continue; Proc:=TPasProcedure(MapItem); - ProcName:=TransformVariableName(Proc,FuncContext); + ProcName:=TransformElToJSName(Proc,FuncContext); IntfProc:=TObject(Intf.Members[i]) as TPasProcedure; - IntfProcName:=TransformVariableName(IntfProc,FuncContext); + IntfProcName:=TransformElToJSName(IntfProc,FuncContext); if IntfProcName=ProcName then continue; if ObjLit=nil then begin @@ -20533,7 +20547,7 @@ begin Call:=CreateCallExpression(PosEl); ProcPath:=CreateReferencePath(Proc.Parent,AContext,rpkPathAndName)+'.'+GetBIName(pbifnHelperNew); Call.Expr:=CreatePrimitiveDotExpr(ProcPath,PosEl); - ProcPath:=TransformVariableName(Proc,AContext); + ProcPath:=TransformElToJSName(Proc,AContext); Call.AddArg(CreateLiteralString(PosEl,ProcPath)); end; ArrLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,PosEl)); @@ -20791,7 +20805,7 @@ begin RaiseNotSupported(El,AContext,20170208141926,'absolute'); V:=TJSVarDeclaration(CreateElement(TJSVarDeclaration,El)); - V.Name:=TransformVariableName(El,AContext); + V.Name:=TransformElToJSName(El,AContext); V.Init:=CreateVarInit(El,AContext); Result:=V; end; @@ -23879,7 +23893,7 @@ begin if Result<>'' then Result:=Result+'.'; rpkPathAndName: begin - ShortName:=TransformVariableName(El,AContext); + ShortName:=TransformElToJSName(El,AContext); if Result='' then Result:=ShortName else if (ShortName<>'') and (ShortName[1] in ['[','(']) then @@ -23944,7 +23958,7 @@ begin Result:=TransformModuleName(TPasModule(Parent),true,AContext) else RaiseNotSupported(El,AContext,20200609230526,GetObjName(aType)); - Result:=Result+'.'+TransformVariableName(aType,AContext); + Result:=Result+'.'+TransformElToJSName(aType,AContext); if AliasGlobals then Result:=CreateGlobalAlias(El,Result,AContext); end; @@ -24878,7 +24892,7 @@ begin ListFirst:=TJSStatementList(CreateElement(TJSStatementList,El.Body)); ListLast:=ListFirst; IfSt.BTrue:=ListFirst; - V:=CreateVarStatement(TransformVariableName(El,El.VariableName,true,AContext), + V:=CreateVarStatement(TransformToJSName(El,El.VariableName,true,AContext), CreatePrimitiveDotExpr(GetBIName(pbivnExceptObject),El),El); ListFirst.A:=V; // add statements @@ -24977,7 +24991,7 @@ begin // create 'A: initvalue' Obj:=TObjectContext(AContext).JSElement as TJSObjectLiteral; ObjLit:=Obj.Elements.AddElement; - ObjLit.Name:=TJSString(TransformVariableName(El,AContext)); + ObjLit.Name:=TJSString(TransformElToJSName(El,AContext)); ObjLit.Expr:=CreateVarInit(El,AContext); end else @@ -25102,7 +25116,7 @@ begin RaiseNotSupported(El,AContext,20190105104054); // local record type elevated to global scope Src:=TJSSourceElements(AContext.JSElement); - VarSt:=CreateVarStatement(TransformVariableName(El,AContext),Call,El); + VarSt:=CreateVarStatement(TransformElToJSName(El,AContext),Call,El); AddToSourceElements(Src,VarSt); // keep Result=nil // add parameter: parent = null Call.AddArg(CreateLiteralNull(El)); @@ -25125,7 +25139,7 @@ begin Call.AddArg(CreatePrimitiveDotExpr(JSParentName,El)); // add parameter: typename: string - Call.AddArg(CreateLiteralString(El,TransformVariableName(El,AContext))); + Call.AddArg(CreateLiteralString(El,TransformElToJSName(El,AContext))); end; // add parameter: initialize function 'function(){...}' @@ -25356,7 +25370,7 @@ begin raise Exception.Create(s); end; -function TPasToJSConverter.TransformVariableName(ErrorEl: TPasElement; +function TPasToJSConverter.TransformToJSName(ErrorEl: TPasElement; const AName: String; CheckGlobal: boolean; AContext: TConvertContext): String; // CheckGlobal: check name clashes with global identifiers too var @@ -25387,7 +25401,7 @@ begin RaiseNotSupported(ErrorEl,AContext,20170203131832); end; -function TPasToJSConverter.TransformVariableName(El: TPasElement; +function TPasToJSConverter.TransformElToJSName(El: TPasElement; AContext: TConvertContext): String; var aType: TPasType; @@ -25402,10 +25416,11 @@ begin aType:=AContext.Resolver.ResolveAliasType(TPasType(El)) else aType:=TPasType(El); - Result:=TransformVariableName(El,aType.Name,CanClashWithGlobal(aType),AContext); + Result:=TransformToJSName(El,GetOverloadName(aType,AContext), + CanClashWithGlobal(aType),AContext); end else - Result:=TransformVariableName(El,GetOverloadName(El,AContext), + Result:=TransformToJSName(El,GetOverloadName(El,AContext), CanClashWithGlobal(El),AContext); end; @@ -25432,7 +25447,7 @@ begin StartP:=p; while (p<=length(aName)) and (aName[p]<>'.') do inc(p); Part:=copy(aName,StartP,p-StartP); - Part:=TransformVariableName(El,Part,false,AContext); + Part:=TransformToJSName(El,Part,false,AContext); if Result<>'' then Result:=Result+'.'; Result:=Result+Part; inc(p); @@ -25684,7 +25699,7 @@ begin RaiseNotSupported(Arg,AContext,20190205190114,GetObjName(Arg.Parent)); end else - Result:=TransformVariableName(Arg,Result,true,AContext); + Result:=TransformToJSName(Arg,Result,true,AContext); end; function TPasToJSConverter.CreateGlobalAlias(El: TPasElement; JSPath: string; diff --git a/packages/pastojs/tests/tcgenerics.pas b/packages/pastojs/tests/tcgenerics.pas index e28ae24e61..bef87a134e 100644 --- a/packages/pastojs/tests/tcgenerics.pas +++ b/packages/pastojs/tests/tcgenerics.pas @@ -81,7 +81,7 @@ type // generic procedure type procedure TestGen_ProcType_ProcLocal; - procedure TestGen_ProcType_ProcLocal_RTTI; + procedure TestGen_ProcType_Local_RTTI_Fail; procedure TestGen_ProcType_ParamUnitImpl; end; @@ -2142,7 +2142,7 @@ begin ''])); end; -procedure TTestGenerics.TestGen_ProcType_ProcLocal_RTTI; +procedure TTestGenerics.TestGen_ProcType_Local_RTTI_Fail; begin WithTypeInfo:=true; StartProgram(false); @@ -2183,8 +2183,10 @@ begin 'var', ' f: specialize TAnt;', ' b: TBird;', + ' p: pointer;', 'begin', ' b:=f(b);', + ' p:=typeinfo(f);', ''])); Add([ 'uses UnitA;', @@ -2196,13 +2198,14 @@ begin 'rtl.module("UnitA", ["system"], function () {', ' var $mod = this;', ' var $impl = $mod.$impl;', - ' $mod.$rtti.$ProcVar("TAnt$G1", {', + ' $mod.$rtti.$ProcVar("TAnt", {', ' init: function () {', ' this.procsig = rtl.newTIProcSig([["a", $mod.$rtti["TBird"], 2]], $mod.$rtti["TBird"]);', ' }', ' });', ' $mod.$init = function () {', ' $impl.b.$assign($impl.f($impl.b));', + ' $impl.p = $mod.$rtti["TAnt"];', ' };', '}, null, function () {', ' var $mod = this;', @@ -2221,10 +2224,11 @@ begin ' });', ' $impl.f = null;', ' $impl.b = $impl.TBird.$new();', + ' $impl.p = null;', '});'])); CheckSource('TestGen_Class_ClassVarRecord_UnitImpl', LinesToStr([ // statements - 'pas.UnitA.$rtti["TAnt$G1"].init();', + 'pas.UnitA.$rtti["TAnt"].init();', '']), LinesToStr([ // $mod.$main '']));