Skip to content

Commit

Permalink
Implemented traversers for mold classes, adds for..in support. #20
Browse files Browse the repository at this point in the history
  • Loading branch information
bero committed Dec 7, 2024
1 parent cabfd3b commit 2f2179a
Showing 1 changed file with 219 additions and 1 deletion.
220 changes: 219 additions & 1 deletion Source/BoldMeta.pas
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,16 @@ TMoldAssociationList = class;
TMoldQualifier = class;
TMoldQualifierList = class;
TMoldComponent = class;
tMoldComponentList = class;
TMoldComponentList = class;

TMoldElementListTraverser = class;
TMoldClassListTraverser = class;
TMoldMemberListTraverser = class;
TMoldRoleListTraverser = class;
TMoldAttributeListTraverser = class;
TMoldAssociationListTraverser = class;
TMoldMethodListTraverser = class;
TMoldQualifierListTraverser = class;

TMoldElementClass = class of TMoldElement;

Expand Down Expand Up @@ -205,7 +214,10 @@ TMoldElementList = class(TBoldIndexableList)
class var IX_Name: integer;
function GetItem(index: Integer): TMoldElement;
function GetItemByName(const name: string): TMoldElement;
protected
function TraverserClass: TBoldIndexableListTraverserClass; override;
public
function GetEnumerator: TMoldElementListTraverser;
constructor Create;
procedure RemoveEntryReference(Item: TMoldElement);
function MakeUniqueName(const prefix: string): string;
Expand All @@ -223,7 +235,10 @@ TMoldClassList = class(TMoldElementList)
function GetItemByName(const name: string): TMoldClass;
function GetItemByExpressionName(const ExpressionName: String): TMoldClass;
function GetItemByDelphiName(const DelphiName: String): TMoldClass;
protected
function TraverserClass: TBoldIndexableListTraverserClass; override;
public
function GetEnumerator: TMoldClassListTraverser;
constructor Create;
property Items[index: Integer]: TMoldClass read GetItem; default;
property ItemsByName[const name: string]: TMoldClass read GetItemByName;
Expand All @@ -236,7 +251,10 @@ TMoldMemberList = class(TMoldElementList)
private
function GetItem(index: Integer): TMoldMember;
function GetItemByName(const name: string): TMoldMember;
protected
function TraverserClass: TBoldIndexableListTraverserClass; override;
public
function GetEnumerator: TMoldMemberListTraverser;
property Items[index: Integer]: TMoldMember read GetItem; default;
property ItemsByName[const name: string]: TMoldMember read GetItemByName;
end;
Expand All @@ -246,7 +264,10 @@ TMoldRoleList = class(TMoldMemberList)
private
function GetItem(index: Integer): TMoldRole;
function GetItemByName(const name: string): TMoldRole;
protected
function TraverserClass: TBoldIndexableListTraverserClass; override;
public
function GetEnumerator: TMoldRoleListTraverser;
property Items[index: Integer]: TMoldRole read GetItem; default;
property ItemsByName[const name: string]: TMoldRole read GetItemByName;
end;
Expand All @@ -256,7 +277,10 @@ TMoldMethodList = class(TMoldElementList)
private
function GetItem(index: Integer): TMoldMethod;
function GetItemByName(const name: string): TMoldMethod;
protected
function TraverserClass: TBoldIndexableListTraverserClass; override;
public
function GetEnumerator: TMoldMethodListTraverser;
property Items[index: Integer]: TMoldMethod read GetItem; default;
property ItemsByName[const name: string]: TMoldMethod read GetItemByName;
end;
Expand All @@ -266,7 +290,10 @@ TMoldAssociationList = class(TMoldElementList)
private
function GetItem(index: Integer): TMoldAssociation;
function GetItemByName(const name: string): TMoldAssociation;
protected
function TraverserClass: TBoldIndexableListTraverserClass; override;
public
function GetEnumerator: TMoldAssociationListTraverser;
property Items[index: Integer]: TMoldAssociation read GetItem; default;
property ItemsByName[const name: string]: TMoldAssociation read GetItemByName;
end;
Expand All @@ -276,7 +303,10 @@ TMoldAttributeList = class(TMoldMemberList)
private
function GetItem(index: Integer): TMoldAttribute;
function GetItemByName(const name: string): TMoldAttribute;
protected
function TraverserClass: TBoldIndexableListTraverserClass; override;
public
function GetEnumerator: TMoldAttributeListTraverser;
property Items[index: Integer]: TMoldAttribute read GetItem; default;
property ItemsByName[const name: string]: TMoldAttribute read GetItemByName;
end;
Expand All @@ -286,11 +316,63 @@ TMoldQualifierList = class(TMoldElementList)
private
function GetItem(index: Integer): TMoldQualifier;
function GetItemByName(const name: string): TMoldQualifier;
protected
function TraverserClass: TBoldIndexableListTraverserClass; override;
public
function GetEnumerator: TMoldQualifierListTraverser;
property Items[index: Integer]: TMoldQualifier read GetItem; default;
property ItemsByName[const name: string]: TMoldQualifier read GetItemByName;
end;

TMoldElementListTraverser = class(TBoldIndexableListTraverser)
public
function GetCurrent: TMoldElement;
property Current: TMoldElement read GetCurrent;
end;

TMoldClassListTraverser = class(TBoldIndexableListTraverser)
public
function GetCurrent: TMoldClass;
property Current: TMoldClass read GetCurrent;
end;

TMoldMemberListTraverser = class(TBoldIndexableListTraverser)
public
function GetCurrent: TMoldMember;
property Current: TMoldMember read GetCurrent;
end;

TMoldRoleListTraverser = class(TBoldIndexableListTraverser)
public
function GetCurrent: TMoldRole;
property Current: TMoldRole read GetCurrent;
end;

TMoldAttributeListTraverser = class(TBoldIndexableListTraverser)
public
function GetCurrent: TMoldAttribute;
property Current: TMoldAttribute read GetCurrent;
end;

TMoldAssociationListTraverser = class(TBoldIndexableListTraverser)
public
function GetCurrent: TMoldAssociation;
property Current: TMoldAssociation read GetCurrent;
end;

TMoldMethodListTraverser = class(TBoldIndexableListTraverser)
public
function GetCurrent: TMoldMethod;
property Current: TMoldMethod read GetCurrent;
end;

TMoldQualifierListTraverser = class(TBoldIndexableListTraverser)
public
function GetCurrent: TMoldQualifier;
property Current: TMoldQualifier read GetCurrent;
end;


{---TMoldClass---}
TMoldClass = class(TMoldElement)
private
Expand Down Expand Up @@ -842,6 +924,11 @@ function TMoldClassList.GetItemByName(const name: string): TMoldClass;
Result := TMoldClass(TBoldCaseSensitiveStringHashIndex(Indexes[IX_Name]).FindByString(name));
end;

function TMoldClassList.TraverserClass: TBoldIndexableListTraverserClass;
begin
result := TMoldClassListTraverser;
end;

function TMoldModel.FindRoleByClassNameAndName(const boldclassName, roleName: string): TMoldRole;
var
MoldClass: TMoldClass;
Expand Down Expand Up @@ -895,11 +982,21 @@ function TMoldClass.GetIntroducesManuallyReverseDerivedMembers: Boolean;
(Attributes[i].Derived and Attributes[i].ReverseDerived);
end;

function TMoldAssociationList.GetEnumerator: TMoldAssociationListTraverser;
begin
result := CreateTraverser as TMoldAssociationListTraverser;
end;

function TMoldAssociationList.GetItem(index: Integer): TMoldAssociation;
begin
Result := TMoldAssociation(inherited Items[index]);
end;

function TMoldRoleList.GetEnumerator: TMoldRoleListTraverser;
begin
result := CreateTraverser as TMoldRoleListTraverser;
end;

function TMoldRoleList.GetItem(index: Integer): TMoldRole;
begin
Result := TMoldRole(inherited Items[index]);
Expand Down Expand Up @@ -1033,6 +1130,11 @@ function TMoldClass.GetIsRootClass: Boolean;
Result := Model.RootClass = self;
end;

function TMoldClassList.GetEnumerator: TMoldClassListTraverser;
begin
result := CreateTraverser as TMoldClassListTraverser;
end;

function TMoldClassList.GetItem(index: Integer): TMoldClass;
begin
Result := TMoldClass(inherited Items[index]);
Expand Down Expand Up @@ -1135,6 +1237,11 @@ function TMoldClass.LowestVisibleAncestor(MoldClass: TMoldClass): TMoldClass;
result := nil;
end;

function TMoldAttributeList.GetEnumerator: TMoldAttributeListTraverser;
begin
result := CreateTraverser as TMoldAttributeListTraverser;
end;

function TMoldAttributeList.GetItem(index: Integer): TMoldAttribute;
begin
Result := TMoldAttribute(inherited Items[index]);
Expand Down Expand Up @@ -1231,6 +1338,11 @@ function TMoldElementList.GetItemByName(const name: string): TMoldElement;
Result := TMoldElement(TBoldCaseSensitiveStringHashIndex(Indexes[IX_Name]).FindByString(name));
end;

function TMoldElementList.GetEnumerator: TMoldElementListTraverser;
begin
result := CreateTraverser as TMoldElementListTraverser;
end;

function TMoldElementList.GetItem(index: Integer): TMoldElement;
begin
Result := TMoldElement(inherited Items[index]);
Expand Down Expand Up @@ -1262,6 +1374,11 @@ procedure TMoldElementList.RemoveEntryReference(Item: TMoldElement);
OwnsEntries := fOwnsEntries;
end;

function TMoldElementList.TraverserClass: TBoldIndexableListTraverserClass;
begin
result := TMoldElementListTraverser;
end;

{---TMoldClassList---}
constructor TMoldClassList.Create;
begin
Expand All @@ -1287,7 +1404,17 @@ function TMoldRoleList.GetItemByName(const name: string): TMoldRole;
Result := TMoldRole(TBoldCaseSensitiveStringHashIndex(Indexes[IX_Name]).FindByString(name));
end;

function TMoldRoleList.TraverserClass: TBoldIndexableListTraverserClass;
begin
result := TMoldRoleListTraverser;
end;

{---TMoldMethodList---}
function TMoldMethodList.GetEnumerator: TMoldMethodListTraverser;
begin
result := CreateTraverser as TMoldMethodListTraverser;
end;

function TMoldMethodList.GetItem(index: Integer): TMoldMethod;
begin
Result := TMoldMethod(inherited Items[index]);
Expand All @@ -1298,21 +1425,41 @@ function TMoldMethodList.GetItemByName(const name: string): TMoldMethod;
Result := TMoldMethod(TBoldCaseSensitiveStringHashIndex(Indexes[IX_Name]).FindByString(name));
end;

function TMoldMethodList.TraverserClass: TBoldIndexableListTraverserClass;
begin
result := TMoldMethodListTraverser;
end;

{---TMoldAssociationList---}

function TMoldAssociationList.GetItemByName(const name: string): TMoldAssociation;
begin
Result := TMoldAssociation(TBoldCaseSensitiveStringHashIndex(Indexes[IX_Name]).FindByString(name));
end;

function TMoldAssociationList.TraverserClass: TBoldIndexableListTraverserClass;
begin
result := TMoldAssociationListTraverser;
end;

{---TMoldAttributeList---}

function TMoldAttributeList.GetItemByName(const name: string): TMoldAttribute;
begin
Result := TMoldAttribute(TBoldCaseSensitiveStringHashIndex(Indexes[IX_Name]).FindByString(name));
end;

function TMoldAttributeList.TraverserClass: TBoldIndexableListTraverserClass;
begin
result := TMoldAttributeListTraverser;
end;

{---TMoldQualifierList---}
function TMoldQualifierList.GetEnumerator: TMoldQualifierListTraverser;
begin
result := CreateTraverser as TMoldQualifierListTraverser;
end;

function TMoldQualifierList.GetItem(index: Integer): TMoldQualifier;
begin
Result := TMoldQualifier(inherited Items[index]);
Expand All @@ -1323,6 +1470,11 @@ function TMoldQualifierList.GetItemByName(const name: string): TMoldQualifier;
Result := TMoldQualifier(TBoldCaseSensitiveStringHashIndex(Indexes[IX_Name]).FindByString(name));
end;

function TMoldQualifierList.TraverserClass: TBoldIndexableListTraverserClass;
begin
result := TMoldQualifierListTraverser;
end;

{---TMoldMember---}

function TMoldMember.GetModel: TMoldModel;
Expand Down Expand Up @@ -2266,6 +2418,11 @@ function TMoldMember.GetManuallyDerived: Boolean;

{ TMoldMemberList }

function TMoldMemberList.GetEnumerator: TMoldMemberListTraverser;
begin
result := CreateTraverser as TMoldMemberListTraverser;
end;

function TMoldMemberList.GetItem(index: Integer): TMoldMember;
begin
result := TMoldMember(Inherited GetItem(index));
Expand All @@ -2278,6 +2435,11 @@ function TMoldMemberList.GetItemByName(const name: string): TMoldMember;
Assert(result is TMoldMember);
end;

function TMoldMemberList.TraverserClass: TBoldIndexableListTraverserClass;
begin
result := TMoldMemberListTraverser;
end;

function TMoldRole.GetDeleteAction: TDeleteAction;
begin
Result := TBoldTaggedValueSupport.StringToDeleteAction(BoldTVByName[TAG_DELETEACTION]);
Expand Down Expand Up @@ -3157,6 +3319,62 @@ function TMoldRole.GetStorage: TBoldStorage;
result := Association.Storage;
end;

{ TMoldElementListTraverser }

function TMoldElementListTraverser.GetCurrent: TMoldElement;
begin
result := inherited GetItem as TMoldElement;
end;

{ TMoldClassListTraverser }

function TMoldClassListTraverser.GetCurrent: TMoldClass;
begin
result := inherited GetItem as TMoldClass;
end;

{ TMoldMemberListTraverser }

function TMoldMemberListTraverser.GetCurrent: TMoldMember;
begin
result := inherited GetItem as TMoldMember;
end;

{ TMoldRoleListTraverser }

function TMoldRoleListTraverser.GetCurrent: TMoldRole;
begin
result := inherited GetItem as TMoldRole;
end;

{ TMoldAttributeListTraverser }

function TMoldAttributeListTraverser.GetCurrent: TMoldAttribute;
begin
result := inherited GetItem as TMoldAttribute;
end;

{ TMoldMethodListTraverser }

function TMoldMethodListTraverser.GetCurrent: TMoldMethod;
begin
result := inherited GetItem as TMoldMethod;
end;

{ TMoldQualifierListTraverser }

function TMoldQualifierListTraverser.GetCurrent: TMoldQualifier;
begin
result := inherited GetItem as TMoldQualifier;
end;

{ TMoldAssociationListTraverser }

function TMoldAssociationListTraverser.GetCurrent: TMoldAssociation;
begin
result := inherited GetItem as TMoldAssociation;
end;

initialization
TMoldElementList.IX_Name := -1;
TMoldClassList.IX_ExpressionName := -1;
Expand Down

0 comments on commit 2f2179a

Please sign in to comment.