소스 검색

fcl-passrc: resolver: external class const

git-svn-id: trunk@38076 -
Mattias Gaertner 7 년 전
부모
커밋
f812c657db
3개의 변경된 파일27개의 추가작업 그리고 11개의 파일을 삭제
  1. 10 6
      packages/fcl-passrc/src/pasresolver.pp
  2. 15 4
      packages/fcl-passrc/src/pparser.pp
  3. 2 1
      packages/fcl-passrc/src/pscanner.pp

+ 10 - 6
packages/fcl-passrc/src/pasresolver.pp

@@ -1419,8 +1419,8 @@ type
     // find value and type of an element
     procedure ComputeElement(El: TPasElement; out ResolvedEl: TPasResolverResult;
       Flags: TPasResolverComputeFlags; StartEl: TPasElement = nil);
-    function Eval(Expr: TPasExpr; Flags: TResEvalFlags; Store: boolean = true): TResEvalValue;
-    function Eval(const Value: TPasResolverResult; Flags: TResEvalFlags; Store: boolean = true): TResEvalValue;
+    function Eval(Expr: TPasExpr; Flags: TResEvalFlags; Store: boolean = true): TResEvalValue; overload;
+    function Eval(const Value: TPasResolverResult; Flags: TResEvalFlags; Store: boolean = true): TResEvalValue; overload;
     // checking compatibilility
     function IsSameType(TypeA, TypeB: TPasType; ResolveAlias: boolean = false): boolean; // check if it is exactly the same
     function CheckCallProcCompatibility(ProcType: TPasProcedureType;
@@ -4004,14 +4004,16 @@ end;
 
 procedure TPasResolver.FinishConstDef(El: TPasConst);
 begin
-  ResolveExpr(El.Expr,rraRead);
+  if El.Expr<>nil then
+    ResolveExpr(El.Expr,rraRead);
   if El.VarType<>nil then
     begin
-    CheckAssignCompatibility(El,El.Expr,true);
+    if El.Expr<>nil then
+      CheckAssignCompatibility(El,El.Expr,true);
     EmitTypeHints(El,El.VarType);
     end
-  else
-    Eval(El.Expr,[refConst])
+  else if El.Expr<>nil then
+    Eval(El.Expr,[refConst]);
 end;
 
 procedure TPasResolver.FinishResourcestring(El: TPasResString);
@@ -11060,6 +11062,8 @@ begin
       C:=FindData.Found.ClassType;
       if (C=TPasProcedure) or (C=TPasFunction) then
         // ok
+      else if (C=TPasConst) then
+        // ok
       else if C.InheritsFrom(TPasVariable)
           and (not (vmClass in TPasVariable(FindData.Found).VarModifiers)) then
         // ok

+ 15 - 4
packages/fcl-passrc/src/pparser.pp

@@ -3471,11 +3471,22 @@ begin
       UngetToken;
       Result.IsConst:=true;
       end;
-    ExpectToken(tkEqual);
     NextToken;
-    Result.Expr:=DoParseConstValueExpression(Result);
-    if (Result.VarType=Nil) and (Result.Expr.Kind=pekRange) then
-      ParseExc(nParserNoConstRangeAllowed, SParserNoConstRangeAllowed );
+    if CurToken=tkEqual then
+      begin
+      NextToken;
+      Result.Expr:=DoParseConstValueExpression(Result);
+      if (Result.VarType=Nil) and (Result.Expr.Kind=pekRange) then
+        ParseExc(nParserNoConstRangeAllowed,SParserNoConstRangeAllowed);
+      end
+    else if (Result.VarType<>nil)
+        and (po_ExtClassConstWithoutExpr in Options)
+        and (Parent is TPasClassType)
+        and TPasClassType(Parent).IsExternal
+        and (TPasClassType(Parent).ObjKind=okClass) then
+      // const without expression is allowed in external class
+    else
+      CheckToken(tkEqual);
     UngetToken;
     CheckHint(Result,True);
     ok:=true;

+ 2 - 1
packages/fcl-passrc/src/pscanner.pp

@@ -560,7 +560,8 @@ type
     po_SelfToken,            // Self is a token. For backward compatibility.
     po_CheckModeSwitches,    // stop on unknown modeswitch with an error
     po_CheckCondFunction,    // stop on unknown function in conditional expression, default: return '0'
-    po_StopOnErrorDirective  // stop on user $Error, $message error|fatal
+    po_StopOnErrorDirective, // stop on user $Error, $message error|fatal
+    po_ExtClassConstWithoutExpr // allow const without expression in external class
     );
   TPOptions = set of TPOption;