mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 15:49:26 +02:00
pastojs: fixed compile
git-svn-id: trunk@41023 -
This commit is contained in:
parent
18f670a822
commit
92b3fc7c78
@ -1127,7 +1127,8 @@ const
|
||||
msExternalClass,
|
||||
msArrayOperators,
|
||||
msIgnoreAttributes,
|
||||
msOmitRTTI];
|
||||
msOmitRTTI,
|
||||
msMultipleScopeHelpers];
|
||||
|
||||
msAllPas2jsBoolSwitchesReadOnly = [
|
||||
bsLongStrings
|
||||
@ -4528,7 +4529,7 @@ begin
|
||||
FindData:=Default(TPRFindData);
|
||||
FindData.ErrorPosEl:=Params;
|
||||
Abort:=false;
|
||||
IterateElements(TIName,@OnFindFirstElement,@FindData,Abort);
|
||||
IterateElements(TIName,@OnFindFirst,@FindData,Abort);
|
||||
RestoreSubExprScopes(ScopeDepth);
|
||||
{$IFDEF VerbosePas2JS}
|
||||
writeln('TPas2JSResolver.BI_TypeInfo_OnGetCallResult TIName="',TIName,'" FindData.Found="',GetObjName(FindData.Found),'"');
|
||||
@ -6056,7 +6057,7 @@ begin
|
||||
//writeln('TPasToJSConverter.CreateFreeOrNewInstanceExpr Proc.Name=',Proc.Name);
|
||||
ProcScope:=Proc.CustomData as TPasProcedureScope;
|
||||
//writeln('TPasToJSConverter.CreateFreeOrNewInstanceExpr ProcScope.Element=',GetObjName(ProcScope.Element),' ProcScope.ClassScope=',GetObjName(ProcScope.ClassOrRecordScope),' ProcScope.DeclarationProc=',GetObjName(ProcScope.DeclarationProc),' ProcScope.ImplProc=',GetObjName(ProcScope.ImplProc),' ProcScope.CustomData=',GetObjName(ProcScope.CustomData));
|
||||
ClassScope:=ProcScope.ClassOrRecordScope;
|
||||
ClassScope:=ProcScope.ClassRecScope;
|
||||
aClass:=ClassScope.Element;
|
||||
if aClass.Name='' then
|
||||
RaiseInconsistency(20170125191923,aClass);
|
||||
@ -13833,7 +13834,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
if ProcScope.ClassOrRecordScope<>nil then
|
||||
if ProcScope.ClassRecScope<>nil then
|
||||
begin
|
||||
// method or class method
|
||||
if not AContext.IsGlobal then
|
||||
@ -13843,7 +13844,7 @@ begin
|
||||
end
|
||||
else
|
||||
begin
|
||||
FuncContext.ThisPas:=ProcScope.ClassOrRecordScope.Element;
|
||||
FuncContext.ThisPas:=ProcScope.ClassRecScope.Element;
|
||||
if bsObjectChecks in FuncContext.ScannerBoolSwitches then
|
||||
begin
|
||||
// rtl.checkMethodCall(this,<class>)
|
||||
@ -13852,7 +13853,7 @@ begin
|
||||
Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),
|
||||
GetBIName(pbifnCheckMethodCall)]);
|
||||
Call.AddArg(CreatePrimitiveDotExpr('this',PosEl));
|
||||
ClassPath:=CreateReferencePath(ProcScope.ClassOrRecordScope.Element,AContext,rpkPathAndName);
|
||||
ClassPath:=CreateReferencePath(ProcScope.ClassRecScope.Element,AContext,rpkPathAndName);
|
||||
Call.AddArg(CreatePrimitiveDotExpr(ClassPath,PosEl));
|
||||
end;
|
||||
|
||||
@ -14943,7 +14944,7 @@ begin
|
||||
Target:=ConvertElement(El,AContext);
|
||||
|
||||
ProcScope:=TPasProcedureScope(ResolvedEl.IdentEl.CustomData);
|
||||
if ProcScope.ClassOrRecordScope=nil then
|
||||
if ProcScope.ClassRecScope=nil then
|
||||
begin
|
||||
// not a method -> simply use the function
|
||||
Result:=Target;
|
||||
@ -15891,7 +15892,7 @@ begin
|
||||
begin
|
||||
// overridden proc is published as well
|
||||
OverriddenProcScope:=ProcScope.OverriddenProc.CustomData as TPasProcedureScope;
|
||||
OverriddenClass:=OverriddenProcScope.ClassOrRecordScope.Element as TPasClassType;
|
||||
OverriddenClass:=OverriddenProcScope.ClassRecScope.Element as TPasClassType;
|
||||
if HasTypeInfo(OverriddenClass,AContext) then
|
||||
exit; // overridden proc was already published in ancestor
|
||||
end;
|
||||
|
@ -169,7 +169,8 @@ const
|
||||
'ExternalClass',
|
||||
'PrefixedAttributes',
|
||||
'IgnoreAttributes',
|
||||
'OmitRTTI'
|
||||
'OmitRTTI',
|
||||
'MultipleScopeHelpers'
|
||||
);
|
||||
|
||||
PCUDefaultBoolSwitches: TBoolSwitches = [
|
||||
@ -2636,6 +2637,9 @@ begin
|
||||
WriteIdentifierScope(Obj,Scope,aContext);
|
||||
|
||||
// not needed: Scope ElevatedLocals
|
||||
// not needed: Scope Helpers
|
||||
if (length(Scope.Helpers)>0) and not (Scope.Element is TInterfaceSection) then
|
||||
RaiseMsg(20190119122007,Section);
|
||||
|
||||
WriteDeclarations(Obj,Section,aContext);
|
||||
if Section is TInterfaceSection then
|
||||
@ -3711,7 +3715,7 @@ begin
|
||||
RaiseMsg(20180219135933,Scope.Element);
|
||||
AddReferenceToObj(Obj,'ImplProc',Scope.ImplProc);
|
||||
AddReferenceToObj(Obj,'Overridden',Scope.OverriddenProc);
|
||||
// ClassScope: TPasClassScope; auto derived
|
||||
// ClassOrRecordScope: TPasClassScope; auto derived
|
||||
if Scope.SelfArg<>nil then
|
||||
RaiseMsg(20180211180457,Scope.Element); // SelfArg only valid for method implementation
|
||||
// Mode: TModeSwitch: auto derived
|
||||
@ -3733,8 +3737,7 @@ begin
|
||||
WritePasElement(Obj,El,aContext);
|
||||
Scope:=El.CustomData as TPas2JSProcedureScope;
|
||||
//writeln('TPCUWriter.WriteProcedure ',GetObjName(El),' ',GetObjName(Scope),' ',Resolver.GetElementSourcePosStr(El));
|
||||
// BEWARE: Scope can be nil for ignored methods of an interface (msIgnoreInterfaces)
|
||||
if (Scope=nil) or (Scope.DeclarationProc=nil) then
|
||||
if Scope.DeclarationProc=nil then
|
||||
begin
|
||||
WriteElementProperty(Obj,El,'ProcType',El.ProcType,aContext);
|
||||
WriteExpr(Obj,El,'Public',El.PublicName,aContext);
|
||||
@ -3752,12 +3755,6 @@ begin
|
||||
if El.MessageType<>pmtInteger then
|
||||
Obj.Add('MessageType',PCUProcedureMessageTypeNames[El.MessageType]);
|
||||
end;
|
||||
|
||||
if Scope=nil then
|
||||
begin
|
||||
Obj.Add('Scope',false); // msIgnoreInterfaces
|
||||
exit;
|
||||
end;
|
||||
WriteProcedureScope(Obj,Scope,aContext);
|
||||
end
|
||||
else
|
||||
@ -5401,6 +5398,7 @@ procedure TPCUReader.ReadSectionScope(Obj: TJSONObject;
|
||||
begin
|
||||
ReadIdentifierScope(Obj,Scope,aContext);
|
||||
// not needed: Scope ElevatedLocals
|
||||
// not needed: Scope Helpers, autogenerated in ReadClassType
|
||||
Scope.BoolSwitches:=ReadBoolSwitches(Obj,Scope.Element,'BoolSwitches',aContext.BoolSwitches);
|
||||
Scope.ModeSwitches:=ReadModeSwitches(Obj,Scope.Element,'ModeSwitches',aContext.ModeSwitches);
|
||||
end;
|
||||
@ -6925,6 +6923,8 @@ var
|
||||
Data: TJSONData;
|
||||
Scope: TPas2JSClassScope;
|
||||
Ref: TResolvedReference;
|
||||
Parent: TPasElement;
|
||||
SectionScope: TPasSectionScope;
|
||||
begin
|
||||
ReadBoolean(Obj,'Forward',El.IsForward,El);
|
||||
|
||||
@ -6986,6 +6986,22 @@ begin
|
||||
begin
|
||||
ReadClassScopeAbstractProcs(Obj,Scope);
|
||||
ReadClassScopeInterfaces(Obj,Scope);
|
||||
|
||||
if El.ObjKind in okAllHelpers then
|
||||
begin
|
||||
// restore cached helpers in interface
|
||||
Parent:=El.Parent;
|
||||
while Parent<>nil do
|
||||
begin
|
||||
if Parent.ClassType=TInterfaceSection then
|
||||
begin
|
||||
SectionScope:=Parent.CustomData as TPasSectionScope;
|
||||
Resolver.AddHelper(El,SectionScope.Helpers);
|
||||
break;
|
||||
end;
|
||||
Parent:=Parent.Parent;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -7328,8 +7344,9 @@ begin
|
||||
ReadElementReference(Obj,Scope,'ImplProc',@Set_ProcedureScope_ImplProc);
|
||||
ReadElementReference(Obj,Scope,'Overridden',@Set_ProcedureScope_Overridden);
|
||||
if Proc.Parent is TPasMembersType then
|
||||
Scope.ClassOrRecordScope:=Proc.Parent.CustomData as TPasClassOrRecordScope; // no AddRef
|
||||
// ClassScope: TPasClassScope; auto derived
|
||||
Scope.ClassRecScope:=Proc.Parent.CustomData as TPasClassOrRecordScope // no AddRef
|
||||
else
|
||||
; // set via Set_ProcedureScope_ImplProc
|
||||
// Scope.SelfArg only valid for method implementation
|
||||
|
||||
Scope.Flags:=ReadProcScopeFlags(Obj,Proc,'SFlags',[]);
|
||||
@ -7346,8 +7363,8 @@ var
|
||||
DeclProc: TPasProcedure;
|
||||
begin
|
||||
// Note: the References are stored in the scope object of the declaration proc,
|
||||
// OTOH in the JSON they are stored in the scope of the implementation
|
||||
// proc, so that all references can be resolved immediately.
|
||||
// But TPCUWriter stores them in the implementation scope, so that all
|
||||
// references can be resolved immediately.
|
||||
if ImplScope.ImplProc<>nil then
|
||||
RaiseMsg(20180318212631,ImplScope.Element);
|
||||
DeclProc:=ImplScope.DeclarationProc;
|
||||
|
@ -668,6 +668,7 @@ procedure TCustomTestPrecompile.CheckRestoredSectionScope(const Path: string;
|
||||
var
|
||||
i: Integer;
|
||||
OrigUses, RestUses: TPas2JSSectionScope;
|
||||
OrigHelperEntry, RestHelperEntry: TPRHelperEntry;
|
||||
begin
|
||||
if Orig.BoolSwitches<>Rest.BoolSwitches then
|
||||
Fail(Path+'.BoolSwitches Orig='+BoolSwitchesToStr(Orig.BoolSwitches)+' Rest='+BoolSwitchesToStr(Rest.BoolSwitches));
|
||||
@ -684,6 +685,18 @@ begin
|
||||
Fail(Path+'.UsesScopes['+IntToStr(i)+'] Orig='+GetObjName(OrigUses)+' Rest='+GetObjName(RestUses));
|
||||
CheckRestoredReference(Path+'.UsesScopes['+IntToStr(i)+']',OrigUses.Element,RestUses.Element);
|
||||
end;
|
||||
AssertEquals(Path+' length(Helpers)',length(Orig.Helpers),length(Rest.Helpers));
|
||||
for i:=0 to length(Orig.Helpers)-1 do
|
||||
begin
|
||||
OrigHelperEntry:=TPRHelperEntry(Orig.Helpers[i]);
|
||||
RestHelperEntry:=TPRHelperEntry(Rest.Helpers[i]);
|
||||
if OrigHelperEntry.ClassType<>RestHelperEntry.ClassType then
|
||||
Fail(Path+'.Helpers['+IntToStr(i)+'] Orig='+GetObjName(OrigHelperEntry)+' Rest='+GetObjName(RestHelperEntry));
|
||||
AssertEquals(Path+'.Helpers['+IntToStr(i)+'].Added',OrigHelperEntry.Added,RestHelperEntry.Added);
|
||||
CheckRestoredReference(Path+'.Helpers['+IntToStr(i)+'].Helper',OrigHelperEntry.Helper,RestHelperEntry.Helper);
|
||||
CheckRestoredReference(Path+'.Helpers['+IntToStr(i)+'].HelperForType',OrigHelperEntry.HelperForType,RestHelperEntry.HelperForType);
|
||||
end;
|
||||
|
||||
AssertEquals(Path+'.Finished',Orig.Finished,Rest.Finished);
|
||||
CheckRestoredIdentifierScope(Path,Orig,Rest);
|
||||
end;
|
||||
@ -810,7 +823,7 @@ begin
|
||||
AssertEquals(Path+'.ResultVarName',Orig.ResultVarName,Rest.ResultVarName);
|
||||
CheckRestoredReference(Path+'.OverriddenProc',Orig.OverriddenProc,Rest.OverriddenProc);
|
||||
|
||||
CheckRestoredScopeReference(Path+'.ClassScope',Orig.ClassOrRecordScope,Rest.ClassOrRecordScope);
|
||||
CheckRestoredScopeReference(Path+'.ClassScope',Orig.ClassRecScope,Rest.ClassRecScope);
|
||||
CheckRestoredElement(Path+'.SelfArg',Orig.SelfArg,Rest.SelfArg);
|
||||
if Orig.Flags<>Rest.Flags then
|
||||
Fail(Path+'.Flags');
|
||||
|
@ -16144,7 +16144,7 @@ begin
|
||||
' end;',
|
||||
'begin']);
|
||||
SetExpectedParserError(
|
||||
'Fields are not allowed in Interfaces at token "Identifier external" in file test1.pp at line 6 column 21',
|
||||
'Fields are not allowed in interface at token "Identifier external" in file test1.pp at line 6 column 21',
|
||||
nParserNoFieldsAllowed);
|
||||
ConvertProgram;
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user