Browse Source

* patch from Dmitry Boyarintsev for Mantis 16346. Strict private/protected support for fcl pascal parser

git-svn-id: trunk@15179 -
marco 15 years ago
parent
commit
8c20080391
2 changed files with 25 additions and 2 deletions
  1. 3 2
      packages/fcl-passrc/src/pastree.pp
  2. 22 0
      packages/fcl-passrc/src/pparser.pp

+ 3 - 2
packages/fcl-passrc/src/pastree.pp

@@ -78,7 +78,8 @@ type
   TPasModule = class;
 
   TPasMemberVisibility = (visDefault, visPrivate, visProtected, visPublic,
-    visPublished, visAutomated);
+    visPublished, visAutomated,
+    visStrictPrivate, visStrictProtected);
 
   TCallingConvention = (ccDefault,ccRegister,ccPascal,ccCDecl,ccStdCall,ccOldFPCCall,ccSafeCall);
 
@@ -847,7 +848,7 @@ const
       visPublished, visAutomated];
 
   VisibilityNames: array[TPasMemberVisibility] of string = (
-    'default', 'private', 'protected', 'public', 'published', 'automated');
+    'default', 'private', 'protected', 'public', 'published', 'automated','strict private', 'strict protected');
 
   ObjKindNames: array[TPasObjKind] of string = (
     'object', 'class', 'interface');

+ 22 - 0
packages/fcl-passrc/src/pparser.pp

@@ -2733,7 +2733,10 @@ var
   i, SourceLinenumber: Integer;
   VarList: TList;
   Element: TPasElement;
+  isStrict: Boolean;
 begin
+  isStrict:=False;
+
   // Save current parsing position to get it correct in all cases
   SourceFilename := Scanner.CurFilename;
   SourceLinenumber := Scanner.CurRow;
@@ -2802,6 +2805,15 @@ begin
           tkIdentifier:
             begin
               s := LowerCase(CurTokenString);
+              if s = 'strict' then
+              begin
+                isStrict:=True;
+                NextToken;
+                s := LowerCase(CurTokenString);
+              end
+              else
+                isStrict:=False;
+
               if s = 'private' then
                 CurVisibility := visPrivate
               else if s = 'protected' then
@@ -2827,6 +2839,16 @@ begin
                   VarList.Free;
                 end;
               end;
+              if isStrict then
+              begin
+                case CurVisibility of
+                  visPrivate   : CurVisibility:=visStrictPrivate;
+                  visProtected : CurVisibility:=visStrictProtected;
+                else
+                  ParseExc('strange strict visiblity');
+                end;
+              end;
+
             end;
           tkProcedure:
             ProcessMethod('procedure', False);