The JCF integrated into Lazarus 1.6.4 does not support class destructors. Since this leads to many of my units having issues, I checked the JCF code and propose this patch:
--- C:/Development/lazarus-1.6.4-fpc-3.0.2/components/jcf2/Parse/BuildParseTree.pas Sun Jul 03 21:41:10 2016
+++ C:/Development/lazarus-1.6.4-fpc-3.0.2/components/jcf2/Parse/BuildParseTree.pas Wed May 03 11:39:15 2017
@@ -3593,14 +3593,16 @@
case fcTokenList.SolidTokenType(2) of
ttProcedure:
RecogniseProcedureDecl(false);
ttFunction:
RecogniseFunctionDecl(false);
ttConstructor:
RecogniseConstructorDecl;
+ ttDestructor:
+ RecogniseDestructorDecl;
ttOperator:
RecogniseClassOperator(True);
else
raise TEParseError.Create('expected class procedure or class function', lc);
end;
end;
else
@@ -4096,14 +4098,17 @@
end;
procedure TBuildParseTree.RecogniseDestructorHeading(const pbDeclaration: boolean);
begin
//DestructorHeading -> DESTRUCTOR Ident [FormalParameters]
PushNode(nDestructorHeading);
+ if fcTokenList.FirstSolidTokenType = ttClass then
+ Recognise(ttClass);
+
Recognise(ttDestructor);
RecogniseMethodName( not pbDeclaration);
if fcTokenList.FirstSolidTokenType = ttOpenBracket then
RecogniseFormalParameters;
RecogniseProcedureDirectives;
@@ -4384,14 +4389,16 @@
RecogniseClassVars;
ttProperty:
begin
RecogniseProperty;
end;
ttConstructor:
RecogniseConstructorHeading(True);
+ ttDestructor:
+ RecogniseDestructorHeading(True);
ttOperator:
RecogniseClassOperator(False);
else
raise TEParseError.Create('Expected class procedure or class function', lc);
end;
end;