📄 umodel.pas
字号:
C : TClassifier;
Mi : IModelIterator;
P : TUnitPackage;
F : TStrCompare;
function InFind(P : TUnitPackage) : TClassifier;
var
Mi : IModelIterator;
begin
Result := nil;
//Search in this unit
if Assigned(TheClass) then
Mi := TModelIterator.Create( P.GetClassifiers , TheClass )
else
Mi := P.GetClassifiers;
while Mi.HasNext do
begin
C := Mi.Next as TClassifier;
if F(C.Name,CName)=0 then
begin
Result := C;
Break;
end;
end;
end;
begin
F := CompareFunc[CaseSense];
//Search in this unit
Result := InFind(Self);
//If nil search in public dependencies
if not Assigned(Result) then
begin
Mi := GetUnitDependencies;
while Mi.HasNext do
begin
P := (Mi.Next as TUnitDependency).Package;
Result := InFind(P);
if Assigned(Result) then
Break;
end;
end;
if not Assigned(Result) and RaiseException then
raise Exception.Create(ClassName + '.FindClassifier failed: ' + CName);
end;
function TUnitPackage.GetClassifiers: IModelIterator;
begin
Result := TModelIterator.Create( FClassifiers );
end;
function TUnitPackage.AddUnitDependency(U: TUnitPackage; Visibility: TVisibility): TUnitDependency;
begin
Assert( (U<>Self) and (U<>nil) ,ClassName + '.AddUnitDependency invalid parameter');
Result := TUnitDependency.Create( Self );
Result.Package := U;
Result.Visibility := Visibility;
FUnitDependencies.Add( Result );
end;
function TUnitPackage.GetUnitDependencies: IModelIterator;
begin
Result := TModelIterator.Create( FUnitDependencies );
end;
{ TClass }
constructor TClass.Create(Owner: TModelEntity);
begin
inherited Create(Owner);
FImplements := TObjectList.Create(False); //Only reference
end;
destructor TClass.Destroy;
begin
//Dont touch listeners if the model is locked.
if not Locked then
begin
Fire(mtBeforeRemove);
// if Assigned(FAncestor) then
// FAncestor.RemoveListener(IBeforeClassListener(Self));
end;
FreeAndNil(FImplements);
inherited;
end;
function TClass.AddAttribute(const NewName: string): TAttribute;
begin
Result := TAttribute.Create(Self);
Result.FName := NewName;
FFeatures.Add(Result);
try
Fire(mtBeforeAddChild, Result);
except
FFeatures.Remove(Result);
raise;
end;
Fire(mtAfterAddChild, Result);
end;
function TClass.AddProperty(const NewName: string): TProperty;
begin
Result := TProperty.Create(Self);
Result.FName := NewName;
FFeatures.Add(Result);
end;
function TClass.AddOperation(const NewName: string): TOperation;
begin
Result := TOperation.Create(Self);
Result.FName := NewName;
FFeatures.Add(Result);
try
Fire(mtBeforeAddChild, Result);
except
FFeatures.Remove(Result);
raise;
end;
Fire(mtAfterAddChild, Result);
end;
class function TClass.GetAfterListener: TGUID;
begin
Result := IAfterClassListener;
end;
class function TClass.GetBeforeListener: TGUID;
begin
Result := IBeforeClassListener;
end;
function TClass.AddImplements(I: TInterface): TInterface;
begin
Result := I;
FImplements.Add(I);
try
Fire(mtBeforeAddChild, Result);
except
FImplements.Remove(I);
raise;
end;
Fire(mtAfterAddChild, Result);
end;
procedure TClass.SetAncestor(const Value: TClass);
var
Old: TClass;
begin
Assert(Value <> Self, 'Tried to set self to ancestor.');
if Value <> FAncestor then
begin
Old := FAncestor;
FAncestor := Value;
try
Fire(mtBeforeEntityChange);
except
FAncestor := Old;
raise;
end;
Fire(mtAfterEntityChange);
end;
end;
procedure TClass.AncestorAddChild(Sender, NewChild: TModelEntity);
begin
ErrorHandler.Trace(Format('%s : %s : %s : %s', ['AncestorAddChild', ClassName, FName, Sender.Name]));
end;
procedure TClass.AncestorChange(Sender: TModelEntity);
begin
ErrorHandler.Trace(Format('%s : %s : %s : %s', ['AncestorChange', ClassName, FName, Sender.Name]));
end;
procedure TClass.AncestorEntityChange(Sender: TModelEntity);
begin
ErrorHandler.Trace(Format('%s : %s : %s : %s', ['AncestorEntityChange', ClassName, FName, Sender.Name]));
Fire(mtBeforeEntityChange);
Fire(mtAfterEntityChange);
end;
procedure TClass.AncestorRemove(Sender: TModelEntity);
begin
ErrorHandler.Trace(Format('%s : %s : %s : %s', ['AncestorRemove', ClassName, FName, Sender.Name]));
FAncestor.RemoveListener(IBeforeClassListener(Self));
Ancestor := nil;
end;
function TClass.GetOperations: IModelIterator;
begin
Result := TModelIterator.Create( GetFeatures , TOperation);
end;
function TClass.GetAttributes: IModelIterator;
begin
Result := TModelIterator.Create( GetFeatures , TAttribute);
end;
function TClass.GetImplements: IModelIterator;
begin
Result := TModelIterator.Create( FImplements );
end;
//Returns a list of classes that inherits from this class.
function TClass.GetDescendants: IModelIterator;
begin
Result := TModelIterator.Create(
(Root as TLogicPackage).GetAllClassifiers,
TClassDescendantFilter.Create(Self) );
end;
{
Finds an operation with same name and signature as parameter.
Used by Delphi-parser to find a modelentity for a method implementation.
}
function TClass.FindOperation(O: TOperation): TOperation;
var
Mi,Omi1,Omi2 : IModelIterator;
O2 : TOperation;
label Skip;
begin
Assert(O<>nil,ClassName + '.FindOperation invalid parameter');
Result := nil;
Mi := GetOperations;
while Mi.HasNext do
begin
O2 := Mi.Next as TOperation;
//Compare nr of parameters
if O.FParameters.Count<>O2.FParameters.Count then
Continue;
{ TODO -ovk : case sensitive match? java/delphi. only delphi-parser calls this method. }
//Compare operation name
if CompareText(O.Name,O2.Name)<>0 then
Continue;
//Compare parameters
Omi1 := O.GetParameters;
Omi2 := O2.GetParameters;
while Omi1.HasNext do
if CompareText((Omi1.Next as TParameter).Name,(Omi2.Next as TParameter).Name)<>0 then
goto Skip;
//Ok, match
Result := O2;
Break;
Skip:
end;
end;
{ TParameter }
class function TParameter.GetAfterListener: TGUID;
begin
Result := IAfterParameterListener;
end;
class function TParameter.GetBeforeListener: TGUID;
begin
Result := IBeforeParameterListener;
end;
{ TOperation }
constructor TOperation.Create(Owner: TModelEntity);
begin
inherited Create(Owner);
FParameters := TObjectList.Create(True);
end;
destructor TOperation.Destroy;
begin
FreeAndNil(FParameters);
inherited;
end;
function TOperation.AddParameter(const NewName: string): TParameter;
begin
Result := TParameter.Create(Self);
Result.FName := NewName;
FParameters.Add(Result);
try
Fire(mtBeforeAddChild, Result);
except
FParameters.Remove(Result);
raise;
end;
Fire(mtAfterAddChild, Result);
end;
class function TOperation.GetAfterListener: TGUID;
begin
Result := IAfterOperationListener;
end;
class function TOperation.GetBeforeListener: TGUID;
begin
Result := IBeforeOperationListener;
end;
procedure TOperation.SetOperationType(const Value: TOperationType);
var
Old: TOperationType;
begin
Old := FOperationType;
if Old <> Value then
begin
FOperationType := Value;
try
Fire(mtBeforeEntityChange);
except
FOperationType := Old;
raise;
end;
Fire(mtAfterEntityChange);
end;
end;
procedure TOperation.SetIsAbstract(const Value: boolean);
var
Old: boolean;
begin
Old := FIsAbstract;
if Old <> Value then
begin
FIsAbstract := Value;
try
Fire(mtBeforeEntityChange);
except
FIsAbstract := Old;
raise;
end {try};
Fire(mtAfterEntityChange);
end;
end;
procedure TOperation.SetReturnValue(const Value: TClassifier);
var
Old: TClassifier;
begin
Old := FReturnValue;
if Old <> Value then
begin
FReturnValue := Value;
try
Fire(mtBeforeEntityChange);
except
FReturnValue := Old;
raise;
end;
Fire(mtAfterEntityChange);
end;
end;
function TOperation.GetParameters: IModelIterator;
begin
Result := TModelIterator.Create( FParameters );
end;
{ TAttribute }
class function TAttribute.GetAfterListener: TGUID;
begin
Result := IAfterAttributeListener;
end;
class function TAttribute.GetBeforeListener: TGUID;
begin
Result := IBeforeAttributeListener;
end;
procedure TAttribute.SetTypeClassifier(const Value: TClassifier);
var
Old: TClassifier;
begin
Old := FTypeClassifier;
if Old <> Value then
begin
FTypeClassifier := Value;
try
Fire(mtBeforeEntityChange);
except
FTypeClassifier := Old;
raise;
end;
Fire(mtAfterEntityChange);
end;
end;
{ TProperty }
class function TProperty.GetAfterListener: TGUID;
begin
Result := IAfterPropertyListener;
end;
class function TProperty.GetBeforeListener: TGUID;
begin
Result := IBeforePropertyListener;
end;
{ TClassifier }
constructor TClassifier.Create(Owner: TModelEntity);
begin
inherited Create(Owner);
FFeatures := TObjectList.Create(True);
end;
destructor TClassifier.Destroy;
begin
FFeatures.Free;
inherited;
end;
function TClassifier.GetFeatures: IModelIterator;
begin
Result := TModelIterator.Create( FFeatures );
end;
{ TInterface }
constructor TInterface.Create(Owner: TModelEntity);
begin
inherited Create(Owner);
end;
destructor TInterface.Destroy;
begin
inherited;
end;
function TInterface.AddOperation(const NewName: string): TOperation;
begin
Result := TOperation.Create(Self);
Result.FName := NewName;
FFeatures.Add(Result);
try
Fire(mtBeforeAddChild, Result);
except
FFeatures.Remove(Result);
raise;
end;
Fire(mtAfterAddChild, Result);
end;
class function TInterface.GetAfterListener: TGUID;
begin
Result := IAfterInterfaceListener;
end;
class function TInterface.GetBeforeListener: TGUID;
begin
Result := IBeforeInterfaceListener;
end;
function TInterface.GetOperations: IModelIterator;
begin
Result := TModelIterator.Create( GetFeatures , TOperation);
end;
procedure TInterface.SetAncestor(const Value: TInterface);
begin
Assert(Value <> Self, 'Tried to set self to ancestor.');
FAncestor := Value;
end;
//Returns a list of classes that implements this interface.
function TInterface.GetImplementingClasses: IModelIterator;
begin
Result := TModelIterator.Create(
(Root as TLogicPackage).GetAllClassifiers,
TInterfaceImplementsFilter.Create(Self) );
end;
function TInterface.AddAttribute(const NewName: string): TAttribute;
begin
Result := TAttribute.Create(Self);
Result.FName := NewName;
FFeatures.Add(Result);
try
Fire(mtBeforeAddChild, Result);
except
FFeatures.Remove(Result);
raise;
end;
Fire(mtAfterAddChild, Result);
end;
function TInterface.GetAttributes : IModelIterator;
begin
Result := TModelIterator.Create( GetFeatures , TAttribute);
end;
{ TDataType }
class function TDataType.GetAfterListener: TGUID;
begin
Result := IBeforeInterfaceListener;
end;
class function TDataType.GetBeforeListener: TGUID;
begin
Result := IAfterInterfaceListener;
end;
{ TAbstractPackage }
function TAbstractPackage.GetConfigFile: string;
begin
Result := ConfigFile;
if (Result='') and Assigned(FOwner) then
Result := (Owner as TAbstractPackage).GetConfigFile;
end;
procedure TAbstractPackage.SetConfigFile(const Value: string);
begin
if Value<>'' then
ConfigFile := ChangeFileExt(Value,ConfigFileExt);
end;
{ TClassDescendantFilter }
constructor TClassDescendantFilter.Create(Ancestor: TClass);
begin
inherited Create;
Self.Ancestor := Ancestor;
end;
//Returns true if M inherits from ancestor
function TClassDescendantFilter.Accept(M: TModelEntity): boolean;
begin
Result := (M is TClass) and ((M as TClass).Ancestor = Ancestor);
end;
{ TInterfaceImplementsFilter }
constructor TInterfaceImplementsFilter.Create(I: TInterface);
begin
inherited Create;
Int := I;
end;
//Returns true if M implements interface Int
function TInterfaceImplementsFilter.Accept(M: TModelEntity): boolean;
begin
Result := (M is TClass) and ((M as TClass).FImplements.IndexOf(Int)<>-1);
end;
//Unique Flag-instance, if Integrator.CurrentEntity=AllClassesPackage then show all classes
function AllClassesPackage : TAbstractPackage;
const
_AllClassesPackage : TAbstractPackage = nil;
begin
if _AllClassesPackage=nil then
_AllClassesPackage := TAbstractPackage.Create(nil);
Result := _AllClassesPackage;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -