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

View File

@ -81,7 +81,7 @@ type
// generic procedure type // generic procedure type
procedure TestGen_ProcType_ProcLocal; procedure TestGen_ProcType_ProcLocal;
procedure TestGen_ProcType_ProcLocal_RTTI; procedure TestGen_ProcType_Local_RTTI_Fail;
procedure TestGen_ProcType_ParamUnitImpl; procedure TestGen_ProcType_ParamUnitImpl;
end; end;
@ -2142,7 +2142,7 @@ begin
''])); '']));
end; end;
procedure TTestGenerics.TestGen_ProcType_ProcLocal_RTTI; procedure TTestGenerics.TestGen_ProcType_Local_RTTI_Fail;
begin begin
WithTypeInfo:=true; WithTypeInfo:=true;
StartProgram(false); StartProgram(false);
@ -2183,8 +2183,10 @@ begin
'var', 'var',
' f: specialize TAnt<TBird>;', ' f: specialize TAnt<TBird>;',
' b: TBird;', ' b: TBird;',
' p: pointer;',
'begin', 'begin',
' b:=f(b);', ' b:=f(b);',
' p:=typeinfo(f);',
''])); '']));
Add([ Add([
'uses UnitA;', 'uses UnitA;',
@ -2196,13 +2198,14 @@ begin
'rtl.module("UnitA", ["system"], function () {', 'rtl.module("UnitA", ["system"], function () {',
' var $mod = this;', ' var $mod = this;',
' var $impl = $mod.$impl;', ' var $impl = $mod.$impl;',
' $mod.$rtti.$ProcVar("TAnt$G1", {', ' $mod.$rtti.$ProcVar("TAnt<UnitA.TBird>", {',
' init: function () {', ' init: function () {',
' this.procsig = rtl.newTIProcSig([["a", $mod.$rtti["TBird"], 2]], $mod.$rtti["TBird"]);', ' this.procsig = rtl.newTIProcSig([["a", $mod.$rtti["TBird"], 2]], $mod.$rtti["TBird"]);',
' }', ' }',
' });', ' });',
' $mod.$init = function () {', ' $mod.$init = function () {',
' $impl.b.$assign($impl.f($impl.b));', ' $impl.b.$assign($impl.f($impl.b));',
' $impl.p = $mod.$rtti["TAnt<UnitA.TBird>"];',
' };', ' };',
'}, null, function () {', '}, null, function () {',
' var $mod = this;', ' var $mod = this;',
@ -2221,10 +2224,11 @@ begin
' });', ' });',
' $impl.f = null;', ' $impl.f = null;',
' $impl.b = $impl.TBird.$new();', ' $impl.b = $impl.TBird.$new();',
' $impl.p = null;',
'});'])); '});']));
CheckSource('TestGen_Class_ClassVarRecord_UnitImpl', CheckSource('TestGen_Class_ClassVarRecord_UnitImpl',
LinesToStr([ // statements LinesToStr([ // statements
'pas.UnitA.$rtti["TAnt$G1"].init();', 'pas.UnitA.$rtti["TAnt<UnitA.TBird>"].init();',
'']), '']),
LinesToStr([ // $mod.$main LinesToStr([ // $mod.$main
''])); '']));