|
@@ -1890,6 +1890,8 @@ type
|
|
|
function IsNameExpr(El: TPasExpr): boolean; inline; // TSelfExpr or TPrimitiveExpr with Kind=pekIdent
|
|
|
function GetNameExprValue(El: TPasExpr): string; // TSelfExpr or TPrimitiveExpr with Kind=pekIdent
|
|
|
function GetNextDottedExpr(El: TPasExpr): TPasExpr;
|
|
|
+ function GetLeftMostExpr(El: TPasExpr): TPasExpr;
|
|
|
+ function GetRightMostExpr(El: TPasExpr): TPasExpr;
|
|
|
function GetUsesUnitInFilename(InFileExpr: TPasExpr): string;
|
|
|
function GetPathStart(El: TPasExpr): TPasExpr;
|
|
|
function GetNewInstanceExpr(El: TPasExpr): TPasExpr;
|
|
@@ -3865,6 +3867,52 @@ begin
|
|
|
until false;
|
|
|
end;
|
|
|
|
|
|
+function TPasResolver.GetLeftMostExpr(El: TPasExpr): TPasExpr;
|
|
|
+var
|
|
|
+ C: TClass;
|
|
|
+begin
|
|
|
+ Result:=El;
|
|
|
+ while Result<>nil do
|
|
|
+ begin
|
|
|
+ El:=Result;
|
|
|
+ C:=Result.ClassType;
|
|
|
+ if C=TBinaryExpr then
|
|
|
+ begin
|
|
|
+ if TBinaryExpr(Result).OpCode<>eopSubIdent then
|
|
|
+ exit;
|
|
|
+ Result:=TBinaryExpr(Result).left;
|
|
|
+ end
|
|
|
+ else if C=TParamsExpr then
|
|
|
+ begin
|
|
|
+ if not (TParamsExpr(Result).Kind in [pekFuncParams,pekArrayParams]) then
|
|
|
+ exit;
|
|
|
+ Result:=TParamsExpr(Result).Value;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+function TPasResolver.GetRightMostExpr(El: TPasExpr): TPasExpr;
|
|
|
+var
|
|
|
+ C: TClass;
|
|
|
+begin
|
|
|
+ Result:=El;
|
|
|
+ while Result<>nil do
|
|
|
+ begin
|
|
|
+ El:=Result;
|
|
|
+ C:=Result.ClassType;
|
|
|
+ if C=TBinaryExpr then
|
|
|
+ begin
|
|
|
+ if TBinaryExpr(Result).OpCode<>eopSubIdent then
|
|
|
+ exit;
|
|
|
+ Result:=TBinaryExpr(Result).right;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
function TPasResolver.GetUsesUnitInFilename(InFileExpr: TPasExpr): string;
|
|
|
var
|
|
|
Value: TResEvalValue;
|
|
@@ -7719,7 +7767,7 @@ begin
|
|
|
{$ENDIF}
|
|
|
// check LHS can be assigned
|
|
|
ComputeElement(El.left,LeftResolved,[rcNoImplicitProc,rcSetReferenceFlags]);
|
|
|
- CheckCanBeLHS(LeftResolved,true,El.left);
|
|
|
+ CheckCanBeLHS(LeftResolved,true,GetRightMostExpr(El.left));
|
|
|
|
|
|
// compute RHS
|
|
|
ResolveExpr(El.right,rraRead);
|
|
@@ -19923,8 +19971,8 @@ procedure TPasResolver.ComputeElement(El: TPasElement; out
|
|
|
writeln('TPasResolver.ComputeElement.ComputeIdentifier "',GetObjName(Expr),'" ',GetResolverResultDbg(ResolvedEl),' Flags=',dbgs(Flags));
|
|
|
{AllowWriteln-}
|
|
|
{$ENDIF}
|
|
|
- if (Expr is TPrimitiveExpr) and (Expr.Parent is TParamsExpr) and (TPrimitiveExpr(Expr).Value='FA') then
|
|
|
- //RaiseNotYetImplemented(20180621235200,Expr);
|
|
|
+ //if (Expr is TPrimitiveExpr) and (Expr.Parent is TParamsExpr) and (TPrimitiveExpr(Expr).Value='FA') then
|
|
|
+ // RaiseNotYetImplemented(20180621235200,Expr);
|
|
|
|
|
|
if not (rcSetReferenceFlags in Flags)
|
|
|
and (rrfNoImplicitCallWithoutParams in Ref.Flags) then
|
|
@@ -19950,7 +19998,6 @@ procedure TPasResolver.ComputeElement(El: TPasElement; out
|
|
|
// function => return result
|
|
|
ComputeElement(TPasFunction(ResolvedEl.IdentEl).FuncType.ResultEl,
|
|
|
ResolvedEl,Flags+[rcType],StartEl);
|
|
|
- Exclude(ResolvedEl.Flags,rrfWritable);
|
|
|
end
|
|
|
else if (ResolvedEl.IdentEl.ClassType=TPasConstructor)
|
|
|
and (rrfNewInstance in Ref.Flags) then
|