pastojs: specialized procedure type RTTI now uses pascal name

git-svn-id: trunk@46792 -
This commit is contained in:
Mattias Gaertner 2020-09-07 11:10:40 +00:00
parent 7159e63614
commit a577fa3e58
2 changed files with 94 additions and 75 deletions

View File

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

View File

@ -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<TBird>;',
' 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<UnitA.TBird>", {',
' 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<UnitA.TBird>"];',
' };',
'}, 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<UnitA.TBird>"].init();',
'']),
LinesToStr([ // $mod.$main
'']));