Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#1224 Проверяет отсутствие кода после асинхронного вызова #1234

Merged
merged 28 commits into from
Apr 16, 2023

Conversation

iArtemv
Copy link
Collaborator

@iArtemv iArtemv commented Jan 16, 2023

Что сделано

  • Добавлена проверка отсуствия кода после следующих асинхронного вызова:

Методы глобального контекста

  1. ВвестиДатуАсинх,
  2. ВвестиЗначениеАсинх,
  3. ВвестиСтрокуАсинх,
  4. ВвестиЧислоАсинх,
  5. ВопросАсинх,
  6. ВыполнитьОбработкуОповещения,
  7. ДокументЗащищенПаролемАсинх,
  8. ЗапроситьРазрешениеПользователяАсинх,
  9. ЗапуститьПриложениеАсинх,
  10. КаталогБиблиотекиМобильногоУстройстваАсинх,
  11. КаталогВременныхФайловАсинх,
  12. КаталогДокументовАсинх,
  13. КопироватьФайлАсинх,
  14. НайтиФайлыАсинх,
  15. НачатьЗапросРазрешенияПользователя,
  16. НачатьЗапускПриложения,
  17. НачатьКопированиеФайла,
  18. НачатьПеремещениеФайла,
  19. НачатьПодключениеВнешнейКомпоненты,
  20. НачатьПодключениеРасширенияПолученияИнформацииОКомпьютере,
  21. НачатьПодключениеРасширенияРаботыСКриптографией,
  22. НачатьПодключениеРасширенияРаботыСФайлами,
  23. НачатьПоискФайлов,
  24. НачатьПолучениеИнформацииОСетевыхАдаптерах,
  25. НачатьПолучениеКаталогаБиблиотекиМобильногоУстройства,
  26. НачатьПолучениеКаталогаВременныхФайлов,
  27. НачатьПолучениеКаталогаДокументов,
  28. НачатьПолучениеРабочегоКаталогаДанныхПользователя,
  29. НачатьПолучениеФайлаССервера,
  30. НачатьПолучениеФайлов,
  31. НачатьПолучениеФайловССервера,
  32. НачатьПомещениеФайла,
  33. НачатьПомещениеФайлаНаСервер,
  34. НачатьПомещениеФайлов,
  35. НачатьПомещениеФайловНаСервер,
  36. НачатьСозданиеДвоичныхДанныхИзФайла,
  37. НачатьСозданиеКаталога,
  38. НачатьУдалениеФайлов,
  39. НачатьУстановкуВнешнейКомпоненты,
  40. НачатьУстановкуРасширенияПолученияИнформацииОКомпьютере,
  41. НачатьУстановкуРасширенияРаботыСКриптографией,
  42. НачатьУстановкуРасширенияРаботыСФайлами,
  43. ОткрытьЗначениеАсинх,
  44. ОткрытьФорму,
  45. ПереместитьФайлАсинх,
  46. ПодключитьВнешнююКомпонентуАсинх,
  47. ПодключитьРасширениеПолученияИнформацииОКомпьютереАсинх,
  48. ПодключитьРасширениеРаботыСКриптографиейАсинх,
  49. ПодключитьРасширениеРаботыСФайламиАсинх,
  50. ПоказатьВводДаты,
  51. ПоказатьВводЗначения,
  52. ПоказатьВводСтроки,
  53. ПоказатьВводЧисла,
  54. ПоказатьВопрос,
  55. ПоказатьЗначение,
  56. ПоказатьОповещениеПользователя,
  57. ПоказатьПредупреждение,
  58. ПолучитьИнформациюОСетевыхАдаптерахАсинх,
  59. ПолучитьФайлССервераАсинх,
  60. ПолучитьФайлыССервераАсинх,
  61. ПоместитьФайлНаСерверАсинх,
  62. ПоместитьФайлыНаСерверАсинх,
  63. ПредупреждениеАсинх,
  64. РабочийКаталогДанныхПользователяАсинх,
  65. СоздатьДвоичныеДанныеИзФайлаАсинх,
  66. СоздатьКаталогАсинх,
  67. УдалитьФайлыАсинх,
  68. УстановитьВнешнююКомпонентуАсинх,
  69. УстановитьРасширениеПолученияИнформацииОКомпьютереАсинх,
  70. УстановитьРасширениеРаботыСКриптографиейАсинх,
  71. УстановитьРасширениеРаботыСФайламиАсинх

Методы различных объектов

  1. ВидеоконференцияАсинх,
  2. ВыбратьАсинх,
  3. ВыбратьДействиеАсинх,
  4. ВыбратьИзМенюАсинх,
  5. ВыбратьИзСпискаАсинх,
  6. ВыбратьЭлементАсинх,
  7. ВыгрузитьАсинх,
  8. ВызватьHTTPМетодАсинх,
  9. ВыполнитьРегистрациюИнформационнойБазыАсинх,
  10. ДобавитьАрхивнуюМеткуВремениАсинх,
  11. ДобавитьАсинх,
  12. ДобавитьОтображаемыйОбъектАсинх,
  13. ДобавитьПодписьАсинх,
  14. ЗагрузитьВидеообъявлениеСВознаграждениемАсинх,
  15. ЗагрузитьПолноэкраннуюРекламуАсинх,
  16. ЗагрузитьРекламныйБаннерАсинх,
  17. ЗакрытьАсинх,
  18. ЗаписатьАсинх,
  19. ЗаписатьБайтАсинх,
  20. ЗаписатьБуферДвоичныхДанныхАсинх,
  21. ЗаписатьВложенияАсинх,
  22. ЗаписатьОтображаемыйОбъектАсинх,
  23. ЗаписатьПодписьАсинх,
  24. ЗаписатьСимволыАсинх,
  25. ЗаписатьСтрокуАсинх,
  26. ЗаписатьУдалениеВложенийАсинх,
  27. ЗаписатьФайлДляПечатиАсинх,
  28. ЗаписатьЦелое16Асинх,
  29. ЗаписатьЦелое32Асинх,
  30. ЗаписатьЦелое64Асинх,
  31. ЗашифроватьАсинх,
  32. ИзменитьАсинх,
  33. ИмяМетодаАсинх,
  34. ИнициализироватьАсинх,
  35. КопироватьВАсинх,
  36. НайтиПоОтпечаткуАсинх,
  37. НайтиПоСерийномуНомеруАсинх,
  38. НайтиПоСубъектуАсинх,
  39. ОбновитьСпискиОтзываСертификатовАсинх,
  40. ОтключитьОбработчикНовыхСообщенийАсинх,
  41. ОткрытьАсинх,
  42. ОткрытьДляДописыванияАсинх,
  43. ОткрытьДляЗаписиАсинх,
  44. ОткрытьДляЧтенияАсинх,
  45. ОткрытьПотокДляЧтенияАсинх,
  46. ОтменитьРегистрациюИнформационнойБазыАсинх,
  47. ОтметитьЭлементыАсинх,
  48. ОтправитьДляОбработкиАсинх,
  49. ПерейтиАсинх,
  50. ПодключитьОбработчикНовыхСообщенийАсинх,
  51. ПодписатьАсинх,
  52. ПолучитьАсинх,
  53. ПолучитьБуферДвоичныхДанныхАсинх,
  54. ПолучитьВложенияАсинх,
  55. ПолучитьВремяИзмененияАсинх,
  56. ПолучитьВсеАсинх,
  57. ПолучитьДанныеАсинх,
  58. ПолучитьДвоичныеДанныеАсинх,
  59. ПолучитьЗаголовкиАсинх,
  60. ПолучитьИмяСвойстваАсинх,
  61. ПолучитьИнформациюМодуляКриптографииАсинх,
  62. ПолучитьКартинкуПредставленияФайлаБиблиотекиМобильногоУстройстваАсинх,
  63. ПолучитьКонтейнерПодписейКриптографииАсинх,
  64. ПолучитьНевидимостьАсинх,
  65. ПолучитьОбсуждениеАсинх,
  66. ПолучитьОписанияПодписейАсинх,
  67. ПолучитьСертификатыИзПодписиАсинх,
  68. ПолучитьТолькоЧтениеАсинх,
  69. ПолучитьУниверсальноеВремяИзмененияАсинх,
  70. ПолучитьХранилищеСертификатовАсинх,
  71. ПоместитьДанныеАсинх,
  72. ПреобразоватьВОттенкиСерогоАсинх,
  73. ПриобрестиАсинх,
  74. ПроверитьАсинх,
  75. ПроверитьМеткуВремениАсинх,
  76. ПроверитьПодписиАсинх,
  77. ПроверитьПодписьАсинх,
  78. ПроверитьСертификатАсинх,
  79. ПропуститьАсинх,
  80. ПропуститьДоАсинх,
  81. ПрочитатьАсинх,
  82. ПрочитатьБайтАсинх,
  83. ПрочитатьВБуферДвоичныхДанныхАсинх,
  84. ПрочитатьДоАсинх,
  85. ПрочитатьСимволыАсинх,
  86. ПрочитатьСтрокуАсинх,
  87. ПрочитатьЦелое16Асинх,
  88. ПрочитатьЦелое32Асинх,
  89. ПрочитатьЦелое64Асинх,
  90. РазделитьАсинх,
  91. РазделитьНаЧастиПоАсинх,
  92. РазмерАсинх,
  93. РасшифроватьАсинх,
  94. РедактироватьАсинх,
  95. СброситьБуферыАсинх,
  96. СканироватьДокументыАсинх,
  97. СоздатьАсинх,
  98. СоздатьВременныйФайлАсинх,
  99. СуществуетАсинх,
  100. УдалитьАсинх,
  101. УдалитьДанныеАсинх,
  102. УсовершенствоватьПодписьАсинх,
  103. УстановитьВремяИзмененияАсинх,
  104. УстановитьИмяСвойстваАсинх,
  105. УстановитьНевидимостьАсинх,
  106. УстановитьРазмерАсинх,
  107. УстановитьТолькоЧтениеАсинх,
  108. УстановитьУниверсальноеВремяИзмененияАсинх,
  109. ЭтоКаталогАсинх,
  110. ЭтоФайлАсинх

Чек-лист

Общее:

  • ветка PR обновлена из master и нет конфликтов
  • Тесты-кейсы, JUnit тесты правильного и неправильного состояния
  • Измененные Вами исходники отформатированы в соответствии с конвенцией
  • Авто-аудит (SonarQube и CheckStyle) пройден, покрытие кода хорошее, ошибок нет, плохой код устранен
  • Добавлена запись в ИСТОРИЮ ИЗМЕНЕНИЯ, включаемая в пользовательскую документацию плагина

Если применимо:

  • Пользовательская документация на доп.инструменты написана (на русском)
  • Описание проверок - на двух языках

Закрываемые задачи

Closes #1224

@iArtemv iArtemv self-assigned this Jan 16, 2023
@iArtemv iArtemv changed the title Проверяет отсутствие кода после асинхронного вызова #1224 Проверяет отсутствие кода после асинхронного вызова Jan 16, 2023
@iArtemv iArtemv force-pushed the feature/issue-1224-code-after-async-call branch 3 times, most recently from dd5e714 to 4249441 Compare January 16, 2023 07:53
@iArtemv iArtemv force-pushed the feature/issue-1224-code-after-async-call branch from 4249441 to 642868e Compare January 16, 2023 09:26

// @formatter:off
private static final String[] ASYNCHRONOUS_METHODS = {
"ShowMessageBox", "ПоказатьПредупреждение", //$NON-NLS-1$ //$NON-NLS-2$
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я тут совсем не уверен, но как-то из наших платформенных артефактов этот список программно нельзя получать? Появятся новые асинхронные метода в платформе, мы их забудем сюда добавить.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вроде нет

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно по контексту платформы собрать все методы у которых есть ОписаниеОповещения, или которые заканчиваются на Async - вынести это в отдельный Кэш-провайдер который по-требованию будут собирать из контекста по версии проверка и кэшировать на время вызова.

Не следует так же забывать про существование асинхронных методов у объектов платформы.

interface AsyncInvocationProvider
{

   // Методы глобального контекста
   Collection<String> getAsyncInvocationNames(Version version);

   // Методы со списком типов в которых они используются
   Map<String, Collection<String>> getAsyncTypeMethodNames(Version version);

}

Согласен с @AlmazNasibullin что асинхронные методы появляются в каждой новой версии платформы.

}
}

private Statement getStatementFromInvoc(Invocation invocation)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно вместо этого метода использовать метод EcoreUtil2.getContainerOfType(EObject, Class<T>).

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да, только в данном случае получается что неизвестно какой там тип будет

@sonarcloud
Copy link

sonarcloud bot commented Jan 26, 2023

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 1 Code Smell

94.1% 94.1% Coverage
0.0% 0.0% Duplication


// @formatter:off
private static final String[] ASYNCHRONOUS_METHODS = {
"ShowMessageBox", "ПоказатьПредупреждение", //$NON-NLS-1$ //$NON-NLS-2$
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно по контексту платформы собрать все методы у которых есть ОписаниеОповещения, или которые заканчиваются на Async - вынести это в отдельный Кэш-провайдер который по-требованию будут собирать из контекста по версии проверка и кэшировать на время вызова.

Не следует так же забывать про существование асинхронных методов у объектов платформы.

interface AsyncInvocationProvider
{

   // Методы глобального контекста
   Collection<String> getAsyncInvocationNames(Version version);

   // Методы со списком типов в которых они используются
   Map<String, Collection<String>> getAsyncTypeMethodNames(Version version);

}

Согласен с @AlmazNasibullin что асинхронные методы появляются в каждой новой версии платформы.

@marmyshev marmyshev added this to the 0.5 для EDT 2023.1 milestone Mar 13, 2023
Comment on lines +153 to +156
for (Expression param : inv.getParams())
{
List<TypeItem> sourceTypes = computeTypes(param);
for (TypeItem typeItem : sourceTypes)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Подозрительный код.

Зачем на вычислять типы значений передаваемых в параметр, если можно взять сразу тип параметра из контекста платформы? Если код нетипизированный в части передаваемых параметров - то тут не сработает, но как бы ожидалось что сработает...

Может быть ситуация что в параметр передали "неопределено" - тогда параметр указан, но "описание оповещения" отсутствует.

Copy link
Collaborator Author

@iArtemv iArtemv Mar 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь проверяется условие соответствия опции, что в параметр фактически передан ОписаниеОповвещения, если тип отличный, не задан парамер или задан Неопределено - то под условие опции не попадает.

@marmyshev marmyshev marked this pull request as draft March 20, 2023 09:22
@sonarcloud
Copy link

sonarcloud bot commented Mar 22, 2023

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

86.8% 86.8% Coverage
0.0% 0.0% Duplication

@iArtemv iArtemv marked this pull request as ready for review March 23, 2023 06:45
@iArtemv iArtemv requested a review from marmyshev March 23, 2023 06:53
@marmyshev marmyshev merged commit 283804d into master Apr 16, 2023
@marmyshev marmyshev deleted the feature/issue-1224-code-after-async-call branch April 16, 2023 01:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Код расположен после асинхронного вызова
3 participants