CodeTools: fix guesstype (type for declaration) with generics.

This commit is contained in:
Martin 2023-03-08 16:54:47 +01:00
parent 0b3e17d77b
commit 84e5a5ba02
5 changed files with 154 additions and 148 deletions

View File

@ -182,8 +182,8 @@ type
public
BaseNode: TCodeTreeNode; // final base type
BaseTool: TPascalParserTool;
NextNode: TCodeTreeNode; // next node on path to the BaseNode
NextTool: TPascalParserTool;
AliasNode: TCodeTreeNode; // alias "type T1 = T2;"
AliasTool: TPascalParserTool;
NextCache: TBaseTypeCache; // used for mem manager
Owner: TCodeTreeNode;
procedure BindToOwner(NewOwner: TCodeTreeNode);
@ -274,6 +274,8 @@ type
TCodeTreeNodeStackEntry = record
Tool: TPascalParserTool;
Node: TCodeTreeNode;
AliasTool: TPascalParserTool;
AliasNode: TCodeTreeNode;
end;
PCodeTreeNodeStackEntry = ^TCodeTreeNodeStackEntry;
@ -1223,6 +1225,8 @@ begin
end;
Entry^.Tool:=NewTool;
Entry^.Node:=NewNode;
Entry^.AliasTool:=nil;
Entry^.AliasNode:=nil;
end;
function NodeExistsInStack(NodeStack: PCodeTreeNodeStack;

View File

@ -5362,6 +5362,8 @@ var
end;
end;
var NewAliasNode: TCodeTreeNode;
procedure CheckResult(var Context: TFindContext);
var
ResultNode: TCodeTreeNode;
@ -5369,28 +5371,29 @@ var
AliasContext: TFindContext;
Cache: TBaseTypeCache;
begin
if (NodeStack<>nil) and (NodeStack<>@MyNodeStack) then exit; // will be handled by caller
if (Context.Node<>nil) and (Context.Node.Desc in [ctnProcedure,ctnProcedureHead])
and (fdfFunctionResult in Params.Flags) then begin
// Note: do not resolve a constructor here
// because TMyClass.Create should return TMyClass
// and not TObject, where the Create is defined
// a proc -> if this is a function then return the Context type
//debugln(['TFindDeclarationTool.FindBaseTypeOfNode checking function Context: ',Context.Tool.ExtractNode(Context.Node,[])]);
Context.Tool.BuildSubTreeForProcHead(Context.Node,ResultNode);
if (ResultNode<>nil) then begin
// a function or an overloaded operator
// search further for the base type of the function Context type
OldFlags:=Params.Flags;
Exclude(Params.Flags,fdfFunctionResult);
//debugln(['TFindDeclarationTool.FindBaseTypeOfNode searching for function Context type: ',Context.Tool.ExtractNode(DummyNode,[])]);
Context:=Context.Tool.FindBaseTypeOfNode(Params,ResultNode,AliasType);
AliasType:=nil; // aliasing has been done
Params.Flags:=OldFlags;
exit;
if not( (NodeStack<>nil) and (NodeStack<>@MyNodeStack) )then begin // will be handled by caller
if (Context.Node<>nil) and (Context.Node.Desc in [ctnProcedure,ctnProcedureHead])
and (fdfFunctionResult in Params.Flags) then begin
// Note: do not resolve a constructor here
// because TMyClass.Create should return TMyClass
// and not TObject, where the Create is defined
// a proc -> if this is a function then return the Context type
//debugln(['TFindDeclarationTool.FindBaseTypeOfNode checking function Context: ',Context.Tool.ExtractNode(Context.Node,[])]);
Context.Tool.BuildSubTreeForProcHead(Context.Node,ResultNode);
if (ResultNode<>nil) then begin
// a function or an overloaded operator
// search further for the base type of the function Context type
OldFlags:=Params.Flags;
Exclude(Params.Flags,fdfFunctionResult);
//debugln(['TFindDeclarationTool.FindBaseTypeOfNode searching for function Context type: ',Context.Tool.ExtractNode(DummyNode,[])]);
Context:=Context.Tool.FindBaseTypeOfNode(Params,ResultNode,AliasType);
AliasType:=nil; // aliasing has been done
Params.Flags:=OldFlags;
exit;
end;
end;
end;
if (Context.Node=nil) and (fdfExceptionOnNotFound in Params.Flags) then begin
if (Context.Tool<>nil) and (Params.Identifier<>nil) then begin
@ -5402,27 +5405,11 @@ var
end;
RaiseBaseTypeOfNotFound;
end;
if AliasType<>nil then begin
// follow the base type chain to the first type
// for example: var d: TDateTime; use TDateTime, instead of Double.
AliasContext.Node:=Node;
if (AliasType<>nil) and (NewAliasNode <> nil) then begin
AliasContext.Node:=NewAliasNode;
AliasContext.Tool:=Self;
while AliasContext.Node<>nil do begin
if AliasContext.Node.Desc in [ctnTypeDefinition,ctnGenericType] then begin
{$IF defined(ShowExprEval) or defined(ShowTriedBaseContexts)}
debugln(['TFindDeclarationTool.FindBaseTypeOfNode.CheckResult using alias ',AliasContext.Tool.ExtractDefinitionName(AliasContext.Node),' instead of base type ',Context.Node.DescAsString]);
{$ENDIF}
AliasType^:=AliasContext;
exit;
end;
if AliasContext.Node.Cache is TBaseTypeCache then begin
Cache:=TBaseTypeCache(AliasContext.Node.Cache);
if AliasContext.Node=Cache.NextNode then break;
AliasContext.Node:=Cache.NextNode;
AliasContext.Tool:=TFindDeclarationTool(Cache.NextTool);
end else
break;
end;
AliasType^ := AliasContext;
end;
end;
@ -5430,17 +5417,23 @@ var
OldInput: TFindDeclarationInput;
ClassIdentNode: TCodeTreeNode;
TestContext: TFindContext;
OldPos: integer;
OldPos, i: integer;
SpecializeNode: TCodeTreeNode;
NameNode: TCodeTreeNode;
IsPredefined: boolean;
OldStartFlags: TFindDeclarationFlags;
NodeStackEntry: PCodeTreeNodeStackEntry;
begin
NewAliasNode := nil;
{$IFDEF CheckNodeTool}CheckNodeTool(Node);{$ENDIF}
//debugln(['TFindDeclarationTool.FindBaseTypeOfNode Flags=[',dbgs(Params.Flags),'] CacheValid=',Node.Cache is TBaseTypeCache]);
if (Node<>nil) and (Node.Cache is TBaseTypeCache) then begin
// base type already cached
Result:=CreateFindContext(TBaseTypeCache(Node.Cache));
if AliasType <> nil then begin
AliasType^.Tool := TFindDeclarationTool(TBaseTypeCache(Node.Cache).AliasTool);
AliasType^.Node := TBaseTypeCache(Node.Cache).AliasNode;
end;
CheckResult(Result);
exit;
end;
@ -5460,6 +5453,11 @@ begin
if NodeStack^.StackPtr>=0 then
AddNodeToStack(NodeStack,Result.Tool,Result.Node);
Result:=CreateFindContext(TBaseTypeCache(Result.Node.Cache));
// May be replaced with NewAliasNode
if AliasType <> nil then begin
AliasType^.Tool := TFindDeclarationTool(TBaseTypeCache(Result.Node.Cache).AliasTool);
AliasType^.Node := TBaseTypeCache(Result.Node.Cache).AliasNode;
end;
break;
end;
{$IFDEF ShowTriedBaseContexts}
@ -5482,6 +5480,21 @@ begin
AddNodeToStack(NodeStack,Result.Tool,Result.Node);
if Result.Node.Desc in [ctnTypeDefinition,ctnGenericType] then begin
if NewAliasNode = nil then NewAliasNode := Result.Node;
i := NodeStack^.StackPtr-1;
while i >= 0 do begin
NodeStackEntry := GetNodeStackEntry(NodeStack, i);
if (NodeStackEntry^.AliasTool <> nil)
or (NodeStackEntry^.Node.Desc in [ctnTypeDefinition,ctnGenericType]) then
break;
NodeStackEntry^.AliasTool := Self;
NodeStackEntry^.AliasNode := Result.Node;
dec(i);
end;
end;
if (Result.Node.Desc in (AllSimpleIdentifierDefinitions+[ctnGenericType]))
then begin
// instead of variable/const/type definition, return the type
@ -5666,7 +5679,10 @@ begin
if NodeStack=@MyNodeStack then begin
// cache the result in all nodes
// do not cache the result of generic type
if not Assigned(Params.GenParams.ParamValuesTool) then
if (not Assigned(Params.GenParams.ParamValuesTool))
and (not (fdfDoNotCache in Params.Flags))
and (not (fodDoNotCache in Params.NewFlags))
then
CreateBaseTypeCaches(NodeStack,Result);
// free node stack
FinalizeNodeStack(NodeStack);
@ -12701,19 +12717,14 @@ begin
{$IFDEF ShowBaseTypeCache}
DebugLn(' i=',DbgS(i),' Node=',Entry^.Node.DescAsString,' "',copy(Entry^.Tool.Src,Entry^.Node.StartPos,15),'"');
{$ENDIF}
if Entry^.AliasNode = nil then continue;
BaseTypeCache:=
CreateNewBaseTypeCache(TFindDeclarationTool(Entry^.Tool),Entry^.Node);
if BaseTypeCache<>nil then begin
BaseTypeCache.BaseNode:=Result.Node;
BaseTypeCache.BaseTool:=Result.Tool;
if i<NodeStack^.StackPtr then begin
NextEntry:=GetNodeStackEntry(NodeStack,i+1);
BaseTypeCache.NextNode:=NextEntry^.Node;
BaseTypeCache.NextTool:=NextEntry^.Tool;
end else begin
BaseTypeCache.NextNode:=Result.Node;
BaseTypeCache.NextTool:=Result.Tool;
end;
BaseTypeCache.AliasNode:=Entry^.AliasNode;
BaseTypeCache.AliasTool:=Entry^.AliasTool;
end;
end;
end;

View File

@ -122,17 +122,16 @@ procedure TCodyNodeInfoDialog.ReportBaseTypeCache(Report: TStringList;
var
Cache: TBaseTypeCache;
BaseContext: TFindContext;
LastBaseContext: TFindContext;
LastBaseContext, AliasContext, LastAliasContext: TFindContext;
i: Integer;
Visited: TFPList;
NextTool: TFindDeclarationTool;
NextNode: TCodeTreeNode;
begin
LastBaseContext:=CleanFindContext;
LastAliasContext:=CleanFindContext;
i:=0;
Visited:=TFPList.Create;
try
while Node<>nil do begin
if Node<>nil then begin
inc(i);
ReportNode(dbgs(i)+': ',Tool,Node);
if not (Node.Cache is TBaseTypeCache) then begin
@ -150,19 +149,11 @@ begin
ReportNode(' Base: ',BaseContext.Tool,BaseContext.Node);
LastBaseContext:=BaseContext;
end;
NextTool:=TFindDeclarationTool(Cache.NextTool);
NextNode:=Cache.NextNode;
if (NextNode<>nil) and (NextTool=nil) then begin
Report.Add('Error: node without tool: Cache.NextTool=nil, Cache.NextNode='+NextNode.DescAsString);
exit;
AliasContext:=CreateFindContext(TFindDeclarationTool(Cache.AliasTool),Cache.AliasNode);
if CompareFindContexts(@LastAliasContext,@AliasContext)<>0 then begin
ReportNode(' Alias: ',AliasContext.Tool,AliasContext.Node);
LastAliasContext:=AliasContext;
end;
if NextNode=Node then begin
// base node reached
exit;
end;
Node:=NextNode;
Tool:=NextTool;
end;
finally
Visited.Free;

View File

@ -579,8 +579,8 @@ end;
procedure GEN_TField1.FieldGenProc;
begin
FField1.MyBaseOnlyProc{ TODO declaration:TMyClassBase.MyBaseOnlyProc};
FField1.MyBaseAndMyClassProc1{ TODO declaration:TMyClass.MyBaseAndMyClassProc1};
FField1.MyBaseOnlyProc{declaration:TMyClassBase.MyBaseOnlyProc};
FField1.MyBaseAndMyClassProc1{declaration:TMyClass.MyBaseAndMyClassProc1};
{$IFDEF WRONG}
FField1.MyClassSubProc{declaration:};
{$ENDIF}
@ -682,11 +682,11 @@ begin
FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField1.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseOnlyProc { TODO declaration:TMyClassBase.MyBaseOnlyProc};
FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyClassSubProc { TODO declaration:TMyClassSub.MyClassSubProc};
FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub { TODO declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseOnlyProc {declaration:TMyClassBase.MyBaseOnlyProc};
FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyClassSubProc {declaration:TMyClassSub.MyClassSubProc};
FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField5.FField1.MyBaseOnlyProc {declaration:TMyClassBase.MyBaseOnlyProc};
FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -706,11 +706,11 @@ begin
FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField1.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseOnlyProc { TODO declaration:TMyClassBase.MyBaseOnlyProc};
FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyClassSubProc { TODO declaration:TMyClassSub.MyClassSubProc};
FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub { TODO declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseOnlyProc {declaration:TMyClassBase.MyBaseOnlyProc};
FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyClassSubProc {declaration:TMyClassSub.MyClassSubProc};
FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField5.FField1.MyBaseOnlyProc {declaration:TMyClassBase.MyBaseOnlyProc};
FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -743,9 +743,9 @@ begin
FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField1.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub { TODO declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
@ -758,9 +758,9 @@ begin
FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField1.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub { TODO declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
@ -783,17 +783,17 @@ begin
FField2.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField2.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseOnlyProc { TODO declaration:TMyClassBase.MyBaseOnlyProc};
FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyClassSubProc { TODO declaration:TMyClassSub.MyClassSubProc};
FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub { TODO declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseOnlyProc {declaration:TMyClassBase.MyBaseOnlyProc};
FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyClassSubProc {declaration:TMyClassSub.MyClassSubProc};
FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField4.FField1.MyBaseOnlyProc { TODO declaration:TMyClassBase.MyBaseOnlyProc};
FField4.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
FField4.FField1.MyClassSubProc { TODO declaration:TMyClassSub.MyClassSubProc};
FField4.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
FField4.FField1.FMySub { TODO declaration:TMyClassSub.FMySub} := 1;
FField4.FField1.MyBaseOnlyProc {declaration:TMyClassBase.MyBaseOnlyProc};
FField4.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
FField4.FField1.MyClassSubProc {declaration:TMyClassSub.MyClassSubProc};
FField4.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField4.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField5.FField1.MyBaseOnlyProc {declaration:TMyClassBase.MyBaseOnlyProc};
FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -825,17 +825,17 @@ begin
FField2.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField2.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseOnlyProc { TODO declaration:TMyClassBase.MyBaseOnlyProc};
FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyClassSubProc { TODO declaration:TMyClassSub.MyClassSubProc};
FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub { TODO declaration:TMyClassSub.FMySub} := 1;
FField3.FField1.MyBaseOnlyProc {declaration:TMyClassBase.MyBaseOnlyProc};
FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
FField3.FField1.MyClassSubProc {declaration:TMyClassSub.MyClassSubProc};
FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField3.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField4.FField1.MyBaseOnlyProc { TODO declaration:TMyClassBase.MyBaseOnlyProc};
FField4.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
FField4.FField1.MyClassSubProc { TODO declaration:TMyClassSub.MyClassSubProc};
FField4.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
FField4.FField1.FMySub { TODO declaration:TMyClassSub.FMySub} := 1;
FField4.FField1.MyBaseOnlyProc {declaration:TMyClassBase.MyBaseOnlyProc};
FField4.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
FField4.FField1.MyClassSubProc {declaration:TMyClassSub.MyClassSubProc};
FField4.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
FField4.FField1.FMySub {declaration:TMyClassSub.FMySub} := 1;
FField5.FField1.MyBaseOnlyProc {declaration:TMyClassBase.MyBaseOnlyProc};
FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -925,10 +925,10 @@ begin
Var1Test_Forw_Field1.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1Test_Forw_Field1.FField2.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
//Var1Test_Forw_Field1.FField2.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_Field1.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_Field1.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1Test_Forw_Field1.FField4.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
//Var1Test_Forw_Field1.FField4.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_Field1.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_Field1.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1Test_Forw_Field1.FField4.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
//Var1Test_Forw_Field1.FField4.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_Field1.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_Field1.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1Test_Forw_Field1.FField6.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -938,10 +938,10 @@ begin
Var1TestInherit_Forw_Field1.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1TestInherit_Forw_Field1.FField2.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
//Var1TestInherit_Forw_Field1.FField2.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_Field1.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_Field1.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1TestInherit_Forw_Field1.FField4.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
//Var1TestInherit_Forw_Field1.FField4.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_Field1.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_Field1.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1TestInherit_Forw_Field1.FField4.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
//Var1TestInherit_Forw_Field1.FField4.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_Field1.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_Field1.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1TestInherit_Forw_Field1.FField6.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -951,10 +951,10 @@ begin
Var1TestInline_Forw_Field1.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1TestInline_Forw_Field1.FField2.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
//Var1TestInline_Forw_Field1.FField2.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_Field1.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_Field1.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1TestInline_Forw_Field1.FField4.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
//Var1TestInline_Forw_Field1.FField4.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_Field1.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_Field1.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1TestInline_Forw_Field1.FField4.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
//Var1TestInline_Forw_Field1.FField4.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_Field1.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_Field1.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var1TestInline_Forw_Field1.FField6.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -971,22 +971,22 @@ begin
Var1Test_Forw_Field3.FField1.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_Field3.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_Field3.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_Field3.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_Field3.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_Field3.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_Field3.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_Field3.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_Field3.FField1.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_Field3.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_Field3.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_Field3.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_Field3.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_Field3.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_Field3.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_Field3.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_Field3.FField1.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_Field3.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_Field3.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_Field3.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_Field3.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_Field3.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_Field3.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_Field3.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
@ -994,10 +994,10 @@ begin
Var1Test_Forw_TField1.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_TField1.FField2.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_TField1.FField2.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_TField1.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_TField1.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_TField1.FField4.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_TField1.FField4.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_TField1.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_TField1.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_TField1.FField4.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_TField1.FField4.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_TField1.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1Test_Forw_TField1.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1Test_Forw_TField1.FField6.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -1007,10 +1007,10 @@ begin
Var1TestInherit_Forw_TField1.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_TField1.FField2.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_TField1.FField2.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_TField1.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_TField1.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_TField1.FField4.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_TField1.FField4.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_TField1.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_TField1.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_TField1.FField4.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_TField1.FField4.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_TField1.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInherit_Forw_TField1.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInherit_Forw_TField1.FField6.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -1020,10 +1020,10 @@ begin
Var1TestInline_Forw_TField1.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_TField1.FField2.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_TField1.FField2.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_TField1.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_TField1.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_TField1.FField4.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_TField1.FField4.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_TField1.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_TField1.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_TField1.FField4.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_TField1.FField4.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_TField1.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var1TestInline_Forw_TField1.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var1TestInline_Forw_TField1.FField6.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -1083,10 +1083,10 @@ begin
Var2Test_Forw_Field1.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var2Test_Forw_Field1.FField2.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
//Var2Test_Forw_Field1.FField2.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_Field1.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_Field1.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var2Test_Forw_Field1.FField4.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
//Var2Test_Forw_Field1.FField4.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_Field1.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_Field1.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var2Test_Forw_Field1.FField4.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
//Var2Test_Forw_Field1.FField4.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_Field1.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_Field1.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
//Var2Test_Forw_Field1.FField6.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -1096,10 +1096,10 @@ begin
Var2Test_Forw_TField1.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_TField1.FField2.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_TField1.FField2.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_TField1.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_TField1.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_TField1.FField4.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_TField1.FField4.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_TField1.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_TField1.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_TField1.FField4.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_TField1.FField4.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_TField1.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_TField1.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_TField1.FField6.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
@ -1116,8 +1116,8 @@ begin
Var2Test_Forw_Field3.FField1.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_Field3.FField1.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_Field3.FField3.FField1.MyBaseAndMyClassProc1 { TODO declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_Field3.FField3.FField1.MyBaseAndMySubProc1 { TODO declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_Field3.FField3.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_Field3.FField3.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};
Var2Test_Forw_Field3.FField5.FField1.MyBaseAndMyClassProc1 {declaration:TMyClass.MyBaseAndMyClassProc1};
Var2Test_Forw_Field3.FField5.FField1.MyBaseAndMySubProc1 {declaration:TMyClassSub.MyBaseAndMySubProc1};

View File

@ -38,8 +38,8 @@ begin
MyData.Foo.{completion:Name,Address,!Helping} ;
MyString.Foo.{completion:Helping,!Name,!Address} ;
d1 := MyData.Foo;
s1 := MyString.Foo;
d1{guesstype:TDataItem} := MyData.Foo;
s1{guesstype:string} := MyString.Foo;
MyData.bar(x);
MyString.bar(y);