summaryrefslogtreecommitdiff
path: root/packages/fcl-passrc/src/pasresolver.pp
diff options
context:
space:
mode:
authormattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-01-01 22:29:58 +0000
committermattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-01-01 22:29:58 +0000
commitfba63d7e4ef0c2c0265574daf7caa21b5aca7132 (patch)
tree987ac78f79072fb8b238178b16dc94261d907158 /packages/fcl-passrc/src/pasresolver.pp
parent4c90417e2eeafb5dca0e02b7d398c32a681ee845 (diff)
downloadfpc-fba63d7e4ef0c2c0265574daf7caa21b5aca7132.tar.gz
fcl-passrc: resolver: parse library
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@47936 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-passrc/src/pasresolver.pp')
-rw-r--r--packages/fcl-passrc/src/pasresolver.pp30
1 files changed, 30 insertions, 0 deletions
diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp
index 5a3de61d52..77630339f3 100644
--- a/packages/fcl-passrc/src/pasresolver.pp
+++ b/packages/fcl-passrc/src/pasresolver.pp
@@ -1698,6 +1698,7 @@ type
procedure FinishAncestors(aClass: TPasClassType); virtual;
procedure FinishMethodResolution(El: TPasMethodResolution); virtual;
procedure FinishAttributes(El: TPasAttributes); virtual;
+ procedure FinishExportSymbol(El: TPasExportSymbol); virtual;
procedure FinishProcParamAccess(ProcType: TPasProcedureType; Params: TParamsExpr); virtual;
procedure FinishPropertyParamAccess(Params: TParamsExpr;
Prop: TPasProperty); virtual;
@@ -5826,6 +5827,7 @@ begin
FinishSection(TPasLibrary(CurModule).LibrarySection);
// resolve begin..end block
ResolveImplBlock(CurModule.InitializationSection);
+ ResolveImplBlock(CurModule.FinalizationSection);
end
else if (CurModuleClass=TPasModule) then
begin
@@ -7776,6 +7778,8 @@ begin
FinishMethodResolution(TPasMethodResolution(El))
else if C=TPasAttributes then
FinishAttributes(TPasAttributes(El))
+ else if C=TPasExportSymbol then
+ FinishExportSymbol(TPasExportSymbol(El))
else
begin
{$IFDEF VerbosePasResolver}
@@ -9133,6 +9137,31 @@ begin
end;
end;
+procedure TPasResolver.FinishExportSymbol(El: TPasExportSymbol);
+
+ procedure CheckExpExpr(Expr: TPasExpr; Kinds: TREVKinds; const Expected: string);
+ var
+ Value: TResEvalValue;
+ ResolvedEl: TPasResolverResult;
+ begin
+ if Expr=nil then exit;
+ ResolveExpr(Expr,rraRead);
+ Value:=Eval(Expr,[refConst]);
+ if (Value<>nil) and (Value.Kind in Kinds) then
+ begin
+ ReleaseEvalValue(Value);
+ exit;
+ end;
+ ReleaseEvalValue(Value);
+ ComputeElement(Expr,ResolvedEl,[rcConstant]);
+ RaiseXExpectedButYFound(20210101194628,Expected,GetTypeDescription(ResolvedEl),Expr);
+ end;
+
+begin
+ CheckExpExpr(El.ExportIndex,[revkInt,revkUInt],'integer');
+ CheckExpExpr(El.ExportName,[revkString,revkUnicodeString],'string');
+end;
+
procedure TPasResolver.FinishProcParamAccess(ProcType: TPasProcedureType;
Params: TParamsExpr);
var
@@ -20836,6 +20865,7 @@ begin
else if AClass.InheritsFrom(TPasImplBlock) then
// resolved when finished
else if AClass=TPasAttributes then
+ else if AClass=TPasExportSymbol then
else if AClass=TPasUnresolvedUnitRef then
RaiseMsg(20171018121900,nCantFindUnitX,sCantFindUnitX,[AName],El)
else