fcl-passrc: comments, analyzer option paoKeepPublished

git-svn-id: trunk@35715 -
This commit is contained in:
Mattias Gaertner 2017-04-03 07:55:49 +00:00
parent bceb016f5f
commit 632b973ed6
3 changed files with 32 additions and 22 deletions

View File

@ -1052,6 +1052,7 @@ type
procedure ResolveImplLabelMark(Mark: TPasImplLabelMark); virtual; procedure ResolveImplLabelMark(Mark: TPasImplLabelMark); virtual;
procedure ResolveImplForLoop(Loop: TPasImplForLoop); virtual; procedure ResolveImplForLoop(Loop: TPasImplForLoop); virtual;
procedure ResolveImplWithDo(El: TPasImplWithDo); virtual; procedure ResolveImplWithDo(El: TPasImplWithDo); virtual;
procedure ResolveImplAsm(El: TPasImplAsmStatement); virtual;
procedure ResolveImplAssign(El: TPasImplAssign); virtual; procedure ResolveImplAssign(El: TPasImplAssign); virtual;
procedure ResolveImplSimple(El: TPasImplSimple); virtual; procedure ResolveImplSimple(El: TPasImplSimple); virtual;
procedure ResolveImplRaise(El: TPasImplRaise); virtual; procedure ResolveImplRaise(El: TPasImplRaise); virtual;
@ -4178,56 +4179,60 @@ begin
end; end;
procedure TPasResolver.ResolveImplElement(El: TPasImplElement); procedure TPasResolver.ResolveImplElement(El: TPasImplElement);
var
C: TClass;
begin begin
//writeln('TPasResolver.ResolveImplElement ',GetObjName(El)); //writeln('TPasResolver.ResolveImplElement ',GetObjName(El));
if El=nil then if El=nil then exit;
else if El.ClassType=TPasImplBeginBlock then C:=El.ClassType;
if C=TPasImplBeginBlock then
ResolveImplBlock(TPasImplBeginBlock(El)) ResolveImplBlock(TPasImplBeginBlock(El))
else if El.ClassType=TPasImplAssign then else if C=TPasImplAssign then
ResolveImplAssign(TPasImplAssign(El)) ResolveImplAssign(TPasImplAssign(El))
else if El.ClassType=TPasImplSimple then else if C=TPasImplSimple then
ResolveImplSimple(TPasImplSimple(El)) ResolveImplSimple(TPasImplSimple(El))
else if El.ClassType=TPasImplBlock then else if C=TPasImplBlock then
ResolveImplBlock(TPasImplBlock(El)) ResolveImplBlock(TPasImplBlock(El))
else if El.ClassType=TPasImplRepeatUntil then else if C=TPasImplRepeatUntil then
begin begin
ResolveImplBlock(TPasImplBlock(El)); ResolveImplBlock(TPasImplBlock(El));
ResolveStatementConditionExpr(TPasImplRepeatUntil(El).ConditionExpr); ResolveStatementConditionExpr(TPasImplRepeatUntil(El).ConditionExpr);
end end
else if El.ClassType=TPasImplIfElse then else if C=TPasImplIfElse then
begin begin
ResolveStatementConditionExpr(TPasImplIfElse(El).ConditionExpr); ResolveStatementConditionExpr(TPasImplIfElse(El).ConditionExpr);
ResolveImplElement(TPasImplIfElse(El).IfBranch); ResolveImplElement(TPasImplIfElse(El).IfBranch);
ResolveImplElement(TPasImplIfElse(El).ElseBranch); ResolveImplElement(TPasImplIfElse(El).ElseBranch);
end end
else if El.ClassType=TPasImplWhileDo then else if C=TPasImplWhileDo then
begin begin
ResolveStatementConditionExpr(TPasImplWhileDo(El).ConditionExpr); ResolveStatementConditionExpr(TPasImplWhileDo(El).ConditionExpr);
ResolveImplElement(TPasImplWhileDo(El).Body); ResolveImplElement(TPasImplWhileDo(El).Body);
end end
else if El.ClassType=TPasImplCaseOf then else if C=TPasImplCaseOf then
ResolveImplCaseOf(TPasImplCaseOf(El)) ResolveImplCaseOf(TPasImplCaseOf(El))
else if El.ClassType=TPasImplLabelMark then else if C=TPasImplLabelMark then
ResolveImplLabelMark(TPasImplLabelMark(El)) ResolveImplLabelMark(TPasImplLabelMark(El))
else if El.ClassType=TPasImplForLoop then else if C=TPasImplForLoop then
ResolveImplForLoop(TPasImplForLoop(El)) ResolveImplForLoop(TPasImplForLoop(El))
else if El.ClassType=TPasImplTry then else if C=TPasImplTry then
begin begin
ResolveImplBlock(TPasImplTry(El)); ResolveImplBlock(TPasImplTry(El));
ResolveImplBlock(TPasImplTry(El).FinallyExcept); ResolveImplBlock(TPasImplTry(El).FinallyExcept);
ResolveImplBlock(TPasImplTry(El).ElseBranch); ResolveImplBlock(TPasImplTry(El).ElseBranch);
end end
else if El.ClassType=TPasImplExceptOn then else if C=TPasImplExceptOn then
// handled in FinishExceptOnStatement // handled in FinishExceptOnStatement
else if El.ClassType=TPasImplRaise then else if C=TPasImplRaise then
ResolveImplRaise(TPasImplRaise(El)) ResolveImplRaise(TPasImplRaise(El))
else if El.ClassType=TPasImplCommand then else if C=TPasImplCommand then
begin begin
if TPasImplCommand(El).Command<>'' then if TPasImplCommand(El).Command<>'' then
RaiseNotYetImplemented(20160922163442,El,'TPasResolver.ResolveImplElement'); RaiseNotYetImplemented(20160922163442,El,'TPasResolver.ResolveImplElement');
end end
else if El.ClassType=TPasImplAsmStatement then else if C=TPasImplAsmStatement then
else if El.ClassType=TPasImplWithDo then ResolveImplAsm(TPasImplAsmStatement(El))
else if C=TPasImplWithDo then
ResolveImplWithDo(TPasImplWithDo(El)) ResolveImplWithDo(TPasImplWithDo(El))
else else
RaiseNotYetImplemented(20160922163445,El,'TPasResolver.ResolveImplElement'); RaiseNotYetImplemented(20160922163445,El,'TPasResolver.ResolveImplElement');
@ -4399,6 +4404,11 @@ begin
PopScope; PopScope;
end; end;
procedure TPasResolver.ResolveImplAsm(El: TPasImplAsmStatement);
begin
if El=nil then ;
end;
procedure TPasResolver.ResolveImplAssign(El: TPasImplAssign); procedure TPasResolver.ResolveImplAssign(El: TPasImplAssign);
var var
LeftResolved, RightResolved: TPasResolverResult; LeftResolved, RightResolved: TPasResolverResult;

View File

@ -854,9 +854,9 @@ type
public public
ProcType : TPasProcedureType; ProcType : TPasProcedureType;
Body : TProcedureBody; Body : TProcedureBody;
PublicName, PublicName, // e.g. public PublicName;
LibrarySymbolName, LibrarySymbolName,
LibraryExpr : TPasExpr; LibraryExpr : TPasExpr; // e.g. external LibraryExpr name LibrarySymbolName;
DispIDExpr : TPasExpr; DispIDExpr : TPasExpr;
AliasName : String; AliasName : String;
Procedure AddModifier(AModifier : TProcedureModifier); Procedure AddModifier(AModifier : TProcedureModifier);

View File

@ -147,7 +147,7 @@ type
end; end;
TPasAnalyzerOption = ( TPasAnalyzerOption = (
paoAlwaysUsePublished, // when a class is used, all its published members are used as well paoKeepPublished, // when a class is used, all its published members are used as well
paoOnlyExports // default: use all class members accessible from outside (protected, but not private) paoOnlyExports // default: use all class members accessible from outside (protected, but not private)
); );
TPasAnalyzerOptions = set of TPasAnalyzerOption; TPasAnalyzerOptions = set of TPasAnalyzerOption;
@ -1112,7 +1112,7 @@ begin
UseType(TPasType(El.Interfaces[i]),paumElement); UseType(TPasType(El.Interfaces[i]),paumElement);
end; end;
// members // members
UsePublished:=(Mode<>paumAllExports) and (paoAlwaysUsePublished in Options); UsePublished:=(Mode<>paumAllExports) and (paoKeepPublished in Options);
for i:=0 to El.Members.Count-1 do for i:=0 to El.Members.Count-1 do
begin begin
Member:=TPasElement(El.Members[i]); Member:=TPasElement(El.Members[i]);
@ -1685,7 +1685,7 @@ begin
if IsExport(El) then exit(false); if IsExport(El) then exit(false);
case El.Visibility of case El.Visibility of
visPrivate,visStrictPrivate: exit(true); visPrivate,visStrictPrivate: exit(true);
visPublished: if paoAlwaysUsePublished in Options then exit(false); visPublished: if paoKeepPublished in Options then exit(false);
end; end;
Result:=IsModuleInternal(El.Parent); Result:=IsModuleInternal(El.Parent);
end; end;