Проект

Общее

Профиль

Отслеживание добавления новых методов

В ходе реализации #17 необходимо было отследить момент создания нового метода у элемента, по ходу выполнения было выявлено несколько странных моментов. Краткое описание доступно в комментариях к указанной задаче, ниже приведена более подробная информация.

Дано

EA 7.5.847

Задача

Отследить добавление нового метода к элементу и узнать его свойства.

Использование EA_OnPreNewMethod

Событие возникает до добавления нового метода и по идее позволяет плагину определять, будет ли этот метод добавлен или нет. Казалось бы, что еще нужно? НО! посмотрим внимательнее, что можно узнать о добавляемом методе:

  • ReturnType - Method.ReturnType
  • Stereotype - Method.Stereotype
  • ParentID - Method.ParentID
  • ClassifierID - Method.ClassifierID

И все! Мне не удалось найти способ определить имя, параметры и другие свойства нового метода. Практически событие пригодно только чтобы узнать о том, что к элементу будет добавлен метод (зачем это может пригодиться я не знаю).

Использование EA_OnPostNewMethod

Это событие возникает уже после того как элемент был добавлен. Свойства:

  • MethodID - Method.MethodID

Используя единственное свойство можно узнать любую информацию о методе. НО не все так просто. Рассмотрим несколько случаев:

Создание нового метода

Создадим новый метод "newMethod". Жмем "New", заполняем свойства:

Добавление метода

Жмем "Save", при этом возникают следующие события:

EA_OnPreNewMethod [{
    Name: ReturnType
    Value: int
    Description: A string value corresponding to Method.ReturnType
    }; {
    Name: Stereotype
    Value: 
    Description: A string value corresponding to Method.Stereotype
    }; {
    Name: ParentID
    Value: 9
    Description: A long value correponding to Method.ParentID
    }; {
    Name: ClassifierID
    Value: 0
    Description: A long value corresponding to Method.ClassifierID
    }; ]

EA_OnPostNewMethod [{
    Name: MethodID
    Value: 62
    Description: A long value corresponding to Method.MethodID
    }; ]

EA_OnContextItemChanged [
    GUID: {F1281627-F8E7-4635-935C-A6767545ADA3}
    objectType: otMethod
    ]

EA_OnNotifyContextItemModified [
    GUID: {4AE0DD67-0EE8-43c6-A968-FCB7F8A64ABF}
    objectType: otElement
    ]

Свойства нового метода, полученные в EA_OnPostNewMethod:

Method [
    Abstract: False
    Behavior: 
    ClassifierID: 0
    Code: 
    Concurrency: Sequential
    IsConst: False
    IsLeaf: False
    IsPure: False
    IsQuery: False
    IsRoot: False
    IsStatic: False
    IsSynchronized: False
    MethodGUID: {F1281627-F8E7-4635-935C-A6767545ADA3}
    MethodID: 62
    Name: newMethod
    Notes: 
    ObjectType: otMethod
    Parameters: EA.CollectionClass
    ParentID: 9
    Pos: 1000
    PostConditions: EA.CollectionClass
    PreConditions: EA.CollectionClass
    ReturnIsArray: False
    ReturnType: int
    StateFlags: 
    Stereotype: 
    StereotypeEx: 
    Style: 
    StyleEx: 
    TaggedValues: EA.CollectionClass
    Throws: 
    Visibility: Public
    ]

Создание нового метода путем копирования

Жмем "Copy":

Клонирование метода

Жмем "OK", при этом возникают следующие события:

EA_OnPreNewMethod [{
    Name: ReturnType
    Value: int
    Description: A string value corresponding to Method.ReturnType
    }; {
    Name: Stereotype
    Value: 
    Description: A string value corresponding to Method.Stereotype
    }; {
    Name: ParentID
    Value: 9
    Description: A long value correponding to Method.ParentID
    }; {
    Name: ClassifierID
    Value: 0
    Description: A long value corresponding to Method.ClassifierID
    }; ]

EA_OnPostNewMethod [{
    Name: MethodID
    Value: 63
    Description: A long value corresponding to Method.MethodID
    }; ]

EA_OnNotifyContextItemModified [
    GUID: {4AE0DD67-0EE8-43c6-A968-FCB7F8A64ABF}
    objectType: otElement
    ]

EA_OnContextItemChanged [
    GUID: {F476EA0C-12BC-4acc-8B5A-E252949F0121}
    objectType: otMethod
    ]

Свойства нового метода, полученные в EA_OnPostNewMethod:

EA_OnPostNewMethod:method [
    Abstract: False
    Behavior: 
    ClassifierID: 0
    Code: 
    Concurrency: Sequential
    IsConst: False
    IsLeaf: False
    IsPure: False
    IsQuery: False
    IsRoot: False
    IsStatic: False
    IsSynchronized: False
    MethodGUID: {F476EA0C-12BC-4acc-8B5A-E252949F0121}
    MethodID: 63
    Name: newMethod
    Notes: 
    ObjectType: otMethod
    Parameters: EA.CollectionClass
    ParentID: 9
    Pos: 0
    PostConditions: EA.CollectionClass
    PreConditions: EA.CollectionClass
    ReturnIsArray: False
    ReturnType: int
    StateFlags: 
    Stereotype: 
    StereotypeEx: 
    Style: 
    StyleEx: 
    TaggedValues: EA.CollectionClass
    Throws: 
    Visibility: Public
]

Добавление Getter-а и/или Setter-а

Делаем атрибут свойством, при этом возникает следующая последовательность событий:

Добавление Getter-а и Setter-а для атрибута

EA_OnPreNewMethod [{
    Name: ReturnType
    Value: void
    Description: A string value corresponding to Method.ReturnType
    }; {
    Name: Stereotype
    Value: property get
    Description: A string value corresponding to Method.Stereotype
    }; {
    Name: ParentID
    Value: 9
    Description: A long value correponding to Method.ParentID
    }; {
    Name: ClassifierID
    Value: 0
    Description: A long value corresponding to Method.ClassifierID
    }; ]
EA_OnPostNewMethod [{
    Name: MethodID
    Value: 16
    Description: A long value corresponding to Method.MethodID
    }; ]
EA_OnPreNewMethod [{
    Name: ReturnType
    Value: void
    Description: A string value corresponding to Method.ReturnType
    }; {
    Name: Stereotype
    Value: property set
    Description: A string value corresponding to Method.Stereotype
    }; {
    Name: ParentID
    Value: 9
    Description: A long value correponding to Method.ParentID
    }; {
    Name: ClassifierID
    Value: 0
    Description: A long value corresponding to Method.ClassifierID
    }; ]
EA_OnPostNewMethod [{
    Name: MethodID
    Value: 17
    Description: A long value corresponding to Method.MethodID
    }; ]
EA_OnNotifyContextItemModified [
    GUID: {B2593BA2-FBB1-49f8-8E0C-22F0E8D5A3A2}
    objectType: otElement
    ]
EA_OnNotifyContextItemModified [
    GUID: {B2593BA2-FBB1-49f8-8E0C-22F0E8D5A3A2}
    objectType: otElement
    ]

Повторный вызов EA_OnNotifyContextItemModified это не ошибка! Первый раз обновился элемент после добавления методов, второй - после изменения свойств атрибута.

Свойства новых методов, полученные в EA_OnPostNewMethod при первом и втором вызове:

EA_OnPostNewMethod:method [
    Abstract: False
    Behavior: 
    ClassifierID: 0
    Code: 
    Concurrency: Sequential
    IsConst: False
    IsLeaf: False
    IsPure: False
    IsQuery: False
    IsRoot: False
    IsStatic: False
    IsSynchronized: False
    MethodGUID: {54C56618-95EA-495d-B7D8-84F8761E258D}
    MethodID: 16
    Name: getTest
    Notes: 
    ObjectType: otMethod
    Parameters: EA.CollectionClass
    ParentID: 9
    Pos: 1
    PostConditions: EA.CollectionClass
    PreConditions: EA.CollectionClass
    ReturnIsArray: False
    ReturnType: var
    StateFlags: 
    Stereotype: property get
    StereotypeEx: property get
    Style: 
    StyleEx: 
    TaggedValues: EA.CollectionClass
    Throws: 
    Visibility: Public
]

EA_OnPostNewMethod:method [
    Abstract: False
    Behavior: 
    ClassifierID: 0
    Code: 
    Concurrency: Sequential
    IsConst: False
    IsLeaf: False
    IsPure: False
    IsQuery: False
    IsRoot: False
    IsStatic: False
    IsSynchronized: False
    MethodGUID: {98459834-6853-48e4-B6DE-AEBE44FCBC48}
    MethodID: 17
    Name: setTest
    Notes: 
    ObjectType: otMethod
    Parameters: EA.CollectionClass
    ParentID: 9
    Pos: 2
    PostConditions: EA.CollectionClass
    PreConditions: EA.CollectionClass
    ReturnIsArray: False
    ReturnType: void
    StateFlags: 
    Stereotype: property set
    StereotypeEx: property set
    Style: 
    StyleEx: 
    TaggedValues: EA.CollectionClass
    Throws: 
    Visibility: Public
]

Добавление нового метода плагином

Неизвестно

Выводы

При внимательном изучении событий видно что:

  1. Различается порядок EA_OnContextItemChanged и EA_OnNotifyContextItemModified после добавления метода
  2. EA_OnContextItemChanged не возникает после добавления Getter-а и/или Setter-а
  3. У нового метода Pos = 1000
  4. У клона имя совпадает(!) с оригиналом
  5. У клона Pos = Pos оригинала

Кроме этого, во время EA_OnPostNewMethod у метода список тегированных (Method.TaggedValues) значений пуст! Возможно, что недоступны и другие коллекции свойств метода.

Исходя из всего вышеперечисленного наилучший вариант - запоминать MethodID (или MethodGUID) в EA_OnPostNewMethod, а все действия производить при возникновении EA_OnNotifyContextItemModified для элемента, к которому был добавлен метод.

Если необходимо удалить клонированный метод после получения его свойств, то это надо делать в EA_OnNotifyContextItemModified, т.к. если это делать в EA_OnContextItemChanged то после удаления метода он останется в списке методов (свойств у него не будет):

Удаленный метод в списке

После повторного открытия списка методов он исчезнет. Способ обновить список из модуля не найден.

1.png Просмотреть - Добавление метода (29,3 КБ) LastDragon, 27.08.2009 13:47

2.png Просмотреть - Клонирование метода (31,4 КБ) LastDragon, 27.08.2009 13:47

3.png Просмотреть - Удаленный метод в списке (30,1 КБ) LastDragon, 27.08.2009 13:47

4.png Просмотреть - Добавление Getter-а и Setter-а для атрибута (22,8 КБ) LastDragon, 15.09.2009 12:09

Экспортировать в PDF HTML TXT