From 2db48927719a4e61dbe3b90fb53ca56212507d87 Mon Sep 17 00:00:00 2001 From: mattias Date: Tue, 17 Jan 2023 22:41:57 +0100 Subject: [PATCH] codetools: lfmtree: parse unitname and nested class --- components/codetools/lfmtrees.pas | 52 ++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/components/codetools/lfmtrees.pas b/components/codetools/lfmtrees.pas index bc7e7b9136..ba959125a2 100644 --- a/components/codetools/lfmtrees.pas +++ b/components/codetools/lfmtrees.pas @@ -81,6 +81,8 @@ type ChildPos: Integer; Name: string; NamePosition: integer; + TypeUnitName: string; + TypeUnitNamePosition: integer; TypeName: string; TypeNamePosition: integer; AncestorTool: TObject; // TFindDeclarationTool @@ -95,7 +97,7 @@ type private FCount: integer; FNames: ^String; - FNamePositions: ^integer; + FNamePositions: PInteger; function GetNamePositions(Index: integer): integer; function GetNames(Index: integer): string; public @@ -745,12 +747,28 @@ begin Parser.CheckToken(toSymbol); if not Parser.TokenSymbolIs('END') then begin ObjectStartLine:=Parser.SourceLine; + + // read TypeName + // or ClassName.TypeName + // or Namespace.UnitName/ClassName.TypeName + // or Name:TypeName + // or Name:TypeName[decimal] + // or Name:UnitName/TypeName + // or Name:Namespace.UnitName/ClassName.TypeName ObjectNode.Name := ''; ObjectNode.TypeName := Parser.TokenString; ObjectNode.TypeNamePosition:=TokenStart; ObjectNode.ChildPos := -1; NextToken; + while Parser.Token = '.' do begin + NextToken; + Parser.CheckToken(toSymbol); + ObjectNode.TypeName := ObjectNode.TypeName+'.'+Parser.TokenString; + NextToken; + end; + if Parser.Token = ':' then begin + // Name:TypeName NextToken; Parser.CheckToken(toSymbol); ObjectNode.Name := ObjectNode.TypeName; @@ -758,15 +776,39 @@ begin ObjectNode.TypeName := Parser.TokenString; ObjectNode.TypeNamePosition:=TokenStart; NextToken; - if parser.Token = '[' then begin + while Parser.Token = '.' do begin NextToken; - ObjectNode.ChildPos := parser.TokenInt; - NextToken; - parser.CheckToken(']'); + Parser.CheckToken(toSymbol); + ObjectNode.TypeName := ObjectNode.TypeName+'.'+Parser.TokenString; NextToken; end; end; + if Parser.Token = '/' then begin + // TypeUnitName/TypeName + NextToken; + Parser.CheckToken(toSymbol); + ObjectNode.TypeUnitName := ObjectNode.TypeName; + ObjectNode.TypeUnitNamePosition:=ObjectNode.TypeNamePosition; + ObjectNode.TypeName := Parser.TokenString; + ObjectNode.TypeNamePosition:=TokenStart; + NextToken; + while Parser.Token = '.' do begin + NextToken; + Parser.CheckToken(toSymbol); + ObjectNode.TypeName := ObjectNode.TypeName+'.'+Parser.TokenString; + NextToken; + end; + end; + + if Parser.Token = '[' then begin + NextToken; + ObjectNode.ChildPos := Parser.TokenInt; + NextToken; + Parser.CheckToken(']'); + NextToken; + end; + // read property list while not (Parser.TokenSymbolIs('END') or Parser.TokenSymbolIs('OBJECT')