mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-01 23:40:26 +02:00
codetools: resolve expr: thisunitname.implementationenidentifier
git-svn-id: trunk@37073 -
This commit is contained in:
parent
420bad1485
commit
c98e01db84
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user