diff options
author | mattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-01-01 22:29:58 +0000 |
---|---|---|
committer | mattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-01-01 22:29:58 +0000 |
commit | fba63d7e4ef0c2c0265574daf7caa21b5aca7132 (patch) | |
tree | 987ac78f79072fb8b238178b16dc94261d907158 /packages/fcl-passrc/src/pasresolver.pp | |
parent | 4c90417e2eeafb5dca0e02b7d398c32a681ee845 (diff) | |
download | fpc-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.pp | 30 |
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 |