pastojs: fixed compile

git-svn-id: trunk@41023 -
This commit is contained in:
Mattias Gaertner 2019-01-23 23:00:29 +00:00
parent 18f670a822
commit 92b3fc7c78
4 changed files with 55 additions and 24 deletions

View File

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

View File

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

View File

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

View File

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