codetools: removed modeswitch clousers, added functionreferences and anonymousfunctions

This commit is contained in:
mattias 2022-05-27 00:17:10 +02:00
parent 0de39307b7
commit 4e92b0a028
2 changed files with 18 additions and 14 deletions

View File

@ -213,7 +213,6 @@ type
ansistring; similarly, char becomes unicodechar rather than ansichar }
cmsTypeHelpers, { allows the declaration of "type helper" (non-Delphi) or "record helper"
(Delphi) for primitive types }
cmsClosures, { Anonymous methods } // not in tmodeswitch / globtype.pas !!!
cmsCBlocks, { support for http://en.wikipedia.org/wiki/Blocks_(C_language_extension) }
cmsISOlike_IO, { I/O as it required by an ISO compatible compiler }
cmsISOLike_Program_Para, { program parameters as it required by an ISO compatible compiler }
@ -224,6 +223,8 @@ type
cmsPrefixedAttributes, { enable attributes that are defined before the type they belong to }
cmsUnderscoreisSeparator, { _ can be used as separator to group digits in numbers }
cmsImplicitFunctionSpecialization, { infer types on calls of generic functions }
cmsFunctionReferences, { allow "reference to" function types }
cmsAnonymousFunctions, { allow anonymous functions }
// not yet in FPC, supported by pas2js:
cmsExternalClass, { pas2js: allow class external [pkgname] name [symbol] }
@ -244,14 +245,16 @@ const
cmsPointer_2_procedure,cmsAutoderef,cmsTp_procvar,cmsInitfinal,cmsDefault_ansistring,
cmsOut,cmsDefault_para,cmsDuplicate_names,cmsHintdirective,
cmsProperty,cmsDefault_inline,cmsExcept,cmsAdvancedRecords,
cmsClosures,cmsPrefixedAttributes,cmsArrayOperators],
cmsPrefixedAttributes,cmsArrayOperators,cmsFunctionReferences,
cmsAnonymousFunctions],
// cmDELPHIUNICODE
[cmsClass,cmsObjpas,cmsResult,cmsString_pchar,
cmsPointer_2_procedure,cmsAutoderef,cmsTp_procvar,cmsInitfinal,
cmsOut,cmsDefault_para,cmsDuplicate_names,cmsHintdirective,
cmsProperty,cmsDefault_inline,cmsExcept,cmsAdvancedRecords,
cmsSystemcodepage,cmsDefault_unicodestring,
cmsClosures,cmsPrefixedAttributes,cmsArrayOperators],
cmsPrefixedAttributes,cmsArrayOperators,cmsFunctionReferences,
cmsAnonymousFunctions],
// cmGPC
[cmsTp_procvar],
// cmTP
@ -307,7 +310,6 @@ const
'FINALFIELDS',
'UNICODESTRINGS',
'TYPEHELPERS',
'CLOSURES', // not in tmodeswitch / globtype.pas
'CBLOCKS',
'ISOIO',
'ISOPROGRAMPARAS',
@ -318,6 +320,8 @@ const
'PREFIXEDATTRIBUTES',
'UNDERSCOREISSEPARATOR',
'IMPLICITFUNCTIONSPECIALIZATION',
'FUNCTIONREFERENCES',
'ANONYMOUSFUNCTIONS',
// not yet in FPC, supported by pas2js:
'EXTERNALCLASS',
'IGNOREATTRIBUTES',

View File

@ -252,12 +252,12 @@ type
Copying: boolean = false; const Attr: TProcHeadAttributes = []);
procedure ReadAnsiStringParams(Extract: boolean = false;
Copying: boolean = false; const Attr: TProcHeadAttributes = []);
function ReadClosure(ExceptionOnError: boolean): boolean;
function ReadAnonymousFunction(ExceptionOnError: boolean): boolean;
function SkipTypeReference(ExceptionOnError: boolean): boolean;
function SkipSpecializeParams(ExceptionOnError: boolean): boolean;
function WordIsPropertyEnd: boolean;
function AllowAttributes: boolean; inline;
function AllowClosures: boolean; inline;
function AllowAnonymousFunctions: boolean; inline;
public
CurSection: TCodeTreeNodeDesc;
@ -1094,8 +1094,8 @@ begin
SaveRaiseEndOfSourceExpected(20170421195401);
end else if UpAtomIs('WITH') then
ReadWithStatement(true,true)
else if (UpAtomIs('PROCEDURE') or UpAtomIs('FUNCTION')) and AllowClosures then
ReadClosure(true);
else if (UpAtomIs('PROCEDURE') or UpAtomIs('FUNCTION')) and AllowAnonymousFunctions then
ReadAnonymousFunction(true);
until false;
except
{$IFDEF ShowIgnoreErrorAfter}
@ -3056,8 +3056,8 @@ begin
and (TryType=ttExcept) then begin
ReadOnStatement(true,CreateNodes);
end else if (UpAtomIs('PROCEDURE') or UpAtomIs('FUNCTION'))
and AllowClosures then begin
ReadClosure(true);
and AllowAnonymousFunctions then begin
ReadAnonymousFunction(true);
end else begin
// check for unexpected keywords
case BlockType of
@ -4997,7 +4997,7 @@ end;
function TPascalParserTool.KeyWordFuncTypeReferenceTo: boolean;
begin
if (Scanner.CompilerModeSwitches*[cmsClosures,cmsCBlocks]<>[])
if (Scanner.CompilerModeSwitches*[cmsFunctionReferences,cmsCBlocks]<>[])
or (Scanner.PascalCompiler=pcPas2js) then begin
CreateChildNode;
CurNode.Desc:=ctnReferenceTo;
@ -6132,7 +6132,7 @@ begin
until false;
end;
function TPascalParserTool.ReadClosure(ExceptionOnError: boolean): boolean;
function TPascalParserTool.ReadAnonymousFunction(ExceptionOnError: boolean): boolean;
{ parse parameter list, result type, calling convention, begin..end
examples:
@ -6301,9 +6301,9 @@ begin
Result:=Scanner.CompilerMode in [cmDELPHI,cmDELPHIUNICODE,cmOBJFPC];
end;
function TPascalParserTool.AllowClosures: boolean;
function TPascalParserTool.AllowAnonymousFunctions: boolean;
begin
Result:=(cmsClosures in Scanner.CompilerModeSwitches)
Result:=(cmsAnonymousFunctions in Scanner.CompilerModeSwitches)
or (Scanner.PascalCompiler=pcPas2js);
end;