From a3a09deeed2f1c321ea01f9c9f6648bece05c979 Mon Sep 17 00:00:00 2001 From: Wosi Date: Thu, 31 Aug 2017 13:33:33 +0200 Subject: [PATCH 1/2] Class variables have class attribute --- Source/DelphiAST.pas | 12 ++++++++++++ Source/SimpleParser/SimpleParser.pas | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Source/DelphiAST.pas b/Source/DelphiAST.pas index 4348e907..fec0c916 100644 --- a/Source/DelphiAST.pas +++ b/Source/DelphiAST.pas @@ -114,6 +114,7 @@ TPasSyntaxTreeBuilder = class(TmwSimplePasPar) procedure ClassProperty; override; procedure ClassReferenceType; override; procedure ClassType; override; + procedure ClassVar; override; procedure CompoundStatement; override; procedure ConstParameter; override; procedure ConstantDeclaration; override; @@ -889,6 +890,17 @@ procedure TPasSyntaxTreeBuilder.ClassType; end; end; +procedure TPasSyntaxTreeBuilder.ClassVar; +var + FieldNode: TSyntaxNode; +begin + inherited; + + for FieldNode in FStack.Peek.ChildNodes do + if FieldNode.Typ = ntField then + FieldNode.SetAttribute(anClass, AttributeValues[atTrue]); +end; + procedure TPasSyntaxTreeBuilder.MoveMembersToVisibilityNodes(TypeNode: TSyntaxNode); var child, vis: TSyntaxNode; diff --git a/Source/SimpleParser/SimpleParser.pas b/Source/SimpleParser/SimpleParser.pas index c39f44f2..f623b8ea 100644 --- a/Source/SimpleParser/SimpleParser.pas +++ b/Source/SimpleParser/SimpleParser.pas @@ -274,6 +274,7 @@ TmwSimplePasPar = class(TObject) procedure ClassReferenceType; virtual; procedure ClassType; virtual; procedure ClassTypeEnd; virtual; + procedure ClassVar; virtual; procedure ClassVisibility; virtual; procedure CompoundStatement; virtual; procedure ConstantColon; virtual; @@ -3696,6 +3697,11 @@ procedure TmwSimplePasPar.ClassHeritage; Expected(ptRoundClose); end; +procedure TmwSimplePasPar.ClassVar; +begin + ClassField; +end; + procedure TmwSimplePasPar.ClassVisibility; var IsStrict: boolean; @@ -3850,7 +3856,7 @@ procedure TmwSimplePasPar.ClassMethodOrProperty; NextToken; while (TokenID = ptIdentifier) and (ExID = ptUnknown) do begin - ClassField; + ClassVar; Semicolon; end; end; From 7f21dbff633b6407e1c73cc649fd905ed638c0b5 Mon Sep 17 00:00:00 2001 From: Wosi Date: Sat, 2 Sep 2017 12:19:34 +0200 Subject: [PATCH 2/2] Fixed class variables --- Source/DelphiAST.pas | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/Source/DelphiAST.pas b/Source/DelphiAST.pas index fec0c916..20884d97 100644 --- a/Source/DelphiAST.pas +++ b/Source/DelphiAST.pas @@ -768,9 +768,13 @@ procedure TPasSyntaxTreeBuilder.ClassClass; procedure TPasSyntaxTreeBuilder.ClassField; var - Fields, Temp: TSyntaxNode; + Fields, Temp, Parent: TSyntaxNode; Field, TypeInfo, TypeArgs: TSyntaxNode; + IsClassVar: Boolean; begin + Parent := FStack.Peek; + IsClassVar := (Parent.Typ = ntVariables) and Parent.HasAttribute(anClass); + Fields := TSyntaxNode.Create(ntFields); try FStack.Push(Fields); @@ -790,6 +794,8 @@ procedure TPasSyntaxTreeBuilder.ClassField; Temp := FStack.Push(ntField); try Temp.AssignPositionFrom(Field); + if IsClassVar then + Temp.SetAttribute(anClass, AttributeValues[atTrue]); FStack.AddChild(Field.Clone); TypeInfo := TypeInfo.Clone; @@ -892,13 +898,22 @@ procedure TPasSyntaxTreeBuilder.ClassType; procedure TPasSyntaxTreeBuilder.ClassVar; var - FieldNode: TSyntaxNode; + FieldNode, Variables: TSyntaxNode; begin - inherited; - - for FieldNode in FStack.Peek.ChildNodes do - if FieldNode.Typ = ntField then - FieldNode.SetAttribute(anClass, AttributeValues[atTrue]); + Variables := FStack.Push(ntVariables); + try + Variables.SetAttribute(anClass, AttributeValues[atTrue]); + inherited; + finally + FStack.Pop; + end; + + try + for FieldNode in Variables.ChildNodes do + FStack.AddChild(FieldNode.Clone); + finally + Variables.ParentNode.DeleteChild(Variables); + end; end; procedure TPasSyntaxTreeBuilder.MoveMembersToVisibilityNodes(TypeNode: TSyntaxNode);