Browse Source

fcl-passrc: resolver: nicer error message when reading a writeonly property

git-svn-id: trunk@39440 -
Mattias Gaertner 7 years ago
parent
commit
21d4e5a1ed

+ 2 - 1
packages/fcl-passrc/src/pasresolveeval.pas

@@ -129,7 +129,7 @@ const
   nCannotNestAnonymousX = 3056;
   nFoundCallCandidateX = 3057;
   nTextAfterFinalIgnored = 3058;
-  // free 3059
+  nNoMemberIsProvidedToAccessProperty = 3059;
   // free 3060
   // free 3061
   // free 3062
@@ -246,6 +246,7 @@ resourcestring
   sCannotNestAnonymousX = 'Cannot nest anonymous %s';
   sFoundCallCandidateX = 'Found call candidate %s';
   sTextAfterFinalIgnored = 'Text after final ''end.''. ignored by compiler';
+  sNoMemberIsProvidedToAccessProperty = 'No member is provided to access property';
   sSymbolXIsNotPortable = 'Symbol "%s" is not portable';
   sSymbolXIsExperimental = 'Symbol "%s" is experimental';
   sSymbolXIsNotImplemented = 'Symbol "%s" is not implemented';

+ 22 - 14
packages/fcl-passrc/src/pasresolver.pp

@@ -1644,6 +1644,7 @@ type
     procedure RaiseContextXExpectedButYFound(id: int64; const C,X,Y: string; El: TPasElement);
     procedure RaiseContextXInvalidY(id: int64; const X,Y: string; El: TPasElement);
     procedure RaiseConstantExprExp(id: int64; ErrorEl: TPasElement);
+    procedure RaiseVarExpected(id: int64; ErrorEl: TPasElement; IdentEl: TPasElement);
     procedure RaiseRangeCheck(id: int64; ErrorEl: TPasElement);
     procedure RaiseIncompatibleTypeDesc(id: int64; MsgNumber: integer;
       const Args: array of const; const GotDesc, ExpDesc: String; ErrorEl: TPasElement);
@@ -5601,7 +5602,7 @@ begin
     ComputeElement(El.AbsoluteExpr,ResolvedAbs,[rcNoImplicitProc]);
     if (not (rrfReadable in ResolvedAbs.Flags))
         or (ResolvedAbs.IdentEl=nil) then
-      RaiseMsg(20171225234734,nVariableIdentifierExpected,sVariableIdentifierExpected,[],El.AbsoluteExpr);
+      RaiseVarExpected(20171225234734,El.AbsoluteExpr,ResolvedAbs.IdentEl);
     C:=ResolvedAbs.IdentEl.ClassType;
     if (C=TPasVariable)
         or (C=TPasArgument)
@@ -5609,7 +5610,7 @@ begin
     else
       RaiseMsg(20171225235203,nVariableIdentifierExpected,sVariableIdentifierExpected,[],El.AbsoluteExpr);
     if not (rrfReadable in ResolvedAbs.Flags) then
-      RaiseMsg(20171225235249,nVariableIdentifierExpected,sVariableIdentifierExpected,[],El.AbsoluteExpr);
+      RaiseVarExpected(20171225235249,El.AbsoluteExpr,ResolvedAbs.IdentEl);
     // check for cycles
     if ResolvedAbs.IdentEl=El then
       RaiseMsg(20171226000703,nVariableIdentifierExpected,sVariableIdentifierExpected,[],El.AbsoluteExpr);
@@ -7105,7 +7106,7 @@ begin
   ResolveExpr(Loop.VariableName,rraReadAndAssign);
   ComputeElement(Loop.VariableName,VarResolved,[rcNoImplicitProc,rcSetReferenceFlags]);
   if not ResolvedElCanBeVarParam(VarResolved,Loop.VariableName) then
-    RaiseMsg(20170216151955,nVariableIdentifierExpected,sVariableIdentifierExpected,[],Loop.VariableName);
+    RaiseVarExpected(20170216151955,Loop.VariableName,VarResolved.IdentEl);
 
   // resolve start expression
   ResolveExpr(Loop.StartExpr,rraRead);
@@ -12236,7 +12237,7 @@ begin
   if not ResolvedElCanBeVarParam(ParamResolved,Expr) then
     begin
     if RaiseOnError then
-      RaiseMsg(20170216152319,nVariableIdentifierExpected,sVariableIdentifierExpected,[],Expr);
+      RaiseVarExpected(20170216152319,Expr,ParamResolved.IdentEl);
     exit;
     end;
   if ParamResolved.BaseType in btAllInteger then
@@ -13147,7 +13148,7 @@ begin
   if not ResolvedElCanBeVarParam(ParamResolved,Expr) then
     begin
     if RaiseOnError then
-      RaiseMsg(20170329171514,nVariableIdentifierExpected,sVariableIdentifierExpected,[],Param);
+      RaiseVarExpected(20170329171514,Param,ParamResolved.IdentEl);
     exit;
     end;
   if (ParamResolved.BaseType<>btContext)
@@ -13215,7 +13216,7 @@ begin
   if not ResolvedElCanBeVarParam(ParamResolved,Expr) then
     begin
     if RaiseOnError then
-      RaiseMsg(20170329173421,nVariableIdentifierExpected,sVariableIdentifierExpected,[],Param);
+      RaiseVarExpected(20170329173421,Param,ParamResolved.IdentEl);
     exit;
     end;
   if (ParamResolved.BaseType<>btContext)
@@ -13375,7 +13376,7 @@ begin
   if not ResolvedElCanBeVarParam(ParamResolved,Expr) then
     begin
     if RaiseOnError then
-      RaiseMsg(20180425005303,nVariableIdentifierExpected,sVariableIdentifierExpected,[],Expr);
+      RaiseVarExpected(20180425005303,Expr,ParamResolved.IdentEl);
     exit;
     end;
   if ParamResolved.BaseType=btContext then
@@ -15242,6 +15243,16 @@ begin
   RaiseMsg(id,nConstantExpressionExpected,sConstantExpressionExpected,[],ErrorEl);
 end;
 
+procedure TPasResolver.RaiseVarExpected(id: int64; ErrorEl: TPasElement;
+  IdentEl: TPasElement);
+begin
+  if IdentEl is TPasProperty then
+    RaiseMsg(id,nNoMemberIsProvidedToAccessProperty,
+      sNoMemberIsProvidedToAccessProperty,[],ErrorEl)
+  else
+    RaiseMsg(id,nVariableIdentifierExpected,sVariableIdentifierExpected,[],ErrorEl);
+end;
+
 procedure TPasResolver.RaiseRangeCheck(id: int64; ErrorEl: TPasElement);
 begin
   RaiseMsg(id,nRangeCheckError,sRangeCheckError,[],ErrorEl);
@@ -15533,8 +15544,7 @@ begin
         if not (rrfReadable in ParamResolved.Flags) then
           begin
           if RaiseOnError then
-            RaiseMsg(20170318234957,nVariableIdentifierExpected,
-              sVariableIdentifierExpected,[],Param);
+            RaiseVarExpected(20180712001415,Param,ParamResolved.IdentEl);
           exit(cIncompatible);
           end;
         ParamCompatibility:=cExact;
@@ -15950,7 +15960,7 @@ begin
         if (ResolvedEl.LoTypeEl<>nil) and (ResolvedEl.ExprEl<>nil) then
           RaiseXExpectedButYFound(20170216152727,'identifier',GetElementTypeName(ResolvedEl.LoTypeEl),ResolvedEl.ExprEl)
         else
-          RaiseMsg(20170216152426,nVariableIdentifierExpected,sVariableIdentifierExpected,[],ErrorEl);
+          RaiseVarExpected(20170216152426,ErrorEl,ResolvedEl.IdentEl);
         end;
       exit;
       end;
@@ -16715,8 +16725,7 @@ begin
         {$IFDEF VerbosePasResolver}
         writeln('TPasResolver.CheckAssignResCompatibility RHS not readable. LHS='+GetResolverResultDbg(LHS)+' RHS='+GetResolverResultDbg(RHS));
         {$ENDIF}
-        RaiseMsg(20170318235637,nVariableIdentifierExpected,
-          sVariableIdentifierExpected,[],ErrorEl);
+        RaiseVarExpected(20170318235637,ErrorEl,RHS.IdentEl);
         end;
       exit(cIncompatible);
       end;
@@ -17635,8 +17644,7 @@ begin
         if ExprResolved.IdentEl is TPasConst then
           RaiseMsg(20180430012609,nCantAssignValuesToConstVariable,sCantAssignValuesToConstVariable,[],Expr)
         else
-          RaiseMsg(20180430012457,nVariableIdentifierExpected,sVariableIdentifierExpected,
-            [],Expr);
+          RaiseVarExpected(20180430012457,Expr,ExprResolved.IdentEl);
         end;
       exit;
       end;

+ 2 - 0
packages/pastojs/src/pas2jsfiler.pp

@@ -1826,8 +1826,10 @@ begin
 end;
 
 function TPCUFiler.CreateElementRef(El: TPasElement): TPCUFilerElementRef;
+{$IFDEF MemCheck}
 var
   Node: TAVLTreeNode;
+{$ENDIF}
 begin
   Result:=TPCUFilerElementRef.Create;
   Result.Element:=El;