codetools: resolve expr: thisunitname.implementationenidentifier

git-svn-id: trunk@37073 -
This commit is contained in:
mattias 2012-04-29 09:28:15 +00:00
parent 420bad1485
commit c98e01db84
2 changed files with 41 additions and 13 deletions

View File

@ -189,7 +189,7 @@ const
ctnInitialization,ctnFinalization]; ctnInitialization,ctnFinalization];
AllFindContextDescs = AllIdentifierDefinitions + AllCodeSections + AllClasses + AllFindContextDescs = AllIdentifierDefinitions + AllCodeSections + AllClasses +
[ctnProcedure]; [ctnProcedure];
AllPointContexts = AllClasses+AllSourceTypes+[ctnEnumerationType,ctnInterface]; AllPointContexts = AllClasses+AllSourceTypes+[ctnEnumerationType,ctnInterface,ctnImplementation];
// CodeTreeNodeSubDescriptors // CodeTreeNodeSubDescriptors

View File

@ -7061,19 +7061,32 @@ var
NewCodeTool: TFindDeclarationTool; NewCodeTool: TFindDeclarationTool;
NewNode: TCodeTreeNode; NewNode: TCodeTreeNode;
begin begin
{$IFDEF ShowExprEval}
debugln([' FindExpressionTypeOfTerm ResolveChildren used unit -> interface node ',dbgstr(ExprType.Context.Tool.ExtractNode(ExprType.Context.Node,[]))]);
{$ENDIF}
aTool:=ExprType.Context.Tool; aTool:=ExprType.Context.Tool;
AnUnitName:=aTool.ExtractUsedUnitName(ExprType.Context.Node,@InFilename); if aTool=Self then begin
NewCodeTool:=aTool.FindCodeToolForUsedUnit(AnUnitName,InFilename,true); NewCodeTool:=Self;
NewCodeTool.BuildInterfaceIdentifierCache(true); NewNode:=Tree.Root.LastChild;
NewNode:=NewCodeTool.FindInterfaceNode; while (NewNode<>nil)
and (NewNode.Desc in [ctnInitialization,ctnFinalization,ctnEndPoint]) do
NewNode:=NewNode.PriorBrother;
{$IFDEF ShowExprEval}
debugln([' FindExpressionTypeOfTerm ResolveChildren self unit -> ',NewNode.DescAsString]);
{$ENDIF}
end else begin
{$IFDEF ShowExprEval}
debugln([' FindExpressionTypeOfTerm ResolveChildren used unit -> interface node ',dbgstr(ExprType.Context.Tool.ExtractNode(ExprType.Context.Node,[]))]);
{$ENDIF}
AnUnitName:=aTool.ExtractUsedUnitName(ExprType.Context.Node,@InFilename);
NewCodeTool:=aTool.FindCodeToolForUsedUnit(AnUnitName,InFilename,true);
NewCodeTool.BuildInterfaceIdentifierCache(true);
NewNode:=NewCodeTool.FindInterfaceNode;
end;
ExprType.Context.Tool:=NewCodeTool; ExprType.Context.Tool:=NewCodeTool;
ExprType.Context.Node:=NewNode; ExprType.Context.Node:=NewNode;
end; end;
procedure ResolveChildren; procedure ResolveChildren;
var
NewNode: TCodeTreeNode;
begin begin
if (ExprType.Context.Node=nil) then exit; if (ExprType.Context.Node=nil) then exit;
{$IFDEF ShowExprEval} {$IFDEF ShowExprEval}
@ -7082,11 +7095,26 @@ var
ResolveBaseTypeOfIdentifier; ResolveBaseTypeOfIdentifier;
if (ExprType.Context.Node=nil) then exit; if (ExprType.Context.Node=nil) then exit;
if (ExprType.Context.Node.Desc in AllUsableSourceTypes) then begin if (ExprType.Context.Node.Desc in AllUsableSourceTypes) then begin
// unit name => interface if ExprType.Context.Tool=Self then begin
{$IFDEF ShowExprEval} // this unit name => implementation
debugln([' FindExpressionTypeOfTerm ResolveChildren unit -> interface node']); // Note: allowed for programs too
{$ENDIF} NewNode:=Tree.Root;
ExprType.Context.Node:=ExprType.Context.Tool.GetInterfaceNode; if NewNode.Desc=ctnUnit then begin
NewNode:=FindImplementationNode;
if NewNode=nil then
NewNode:=FindInterfaceNode;
end;
{$IFDEF ShowExprEval}
debugln([' FindExpressionTypeOfTerm ResolveChildren this unit -> ',NewNode.DescAsString]);
{$ENDIF}
ExprType.Context.Node:=NewNode;
end else begin
// unit name => interface
{$IFDEF ShowExprEval}
debugln([' FindExpressionTypeOfTerm ResolveChildren unit -> interface node']);
{$ENDIF}
ExprType.Context.Node:=ExprType.Context.Tool.GetInterfaceNode;
end;
end end
else if (ExprType.Context.Node.Desc=ctnUseUnit) then begin else if (ExprType.Context.Node.Desc=ctnUseUnit) then begin
// uses unit name => interface of used unit // uses unit name => interface of used unit