mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 01:09:27 +02:00
pastojs: specialized procedure type RTTI now uses pascal name
git-svn-id: trunk@46792 -
This commit is contained in:
parent
7159e63614
commit
a577fa3e58
@ -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;
|
||||
|
@ -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
|
||||
'']));
|
||||
|
Loading…
Reference in New Issue
Block a user