{"id":378378,"date":"2024-06-09T15:00:06","date_gmt":"2024-06-09T15:00:06","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=378378"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-09T15:00:06","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=378378","title":{"rendered":"<span>\u041f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 \u043c\u0438\u0440 Lint&#8217;a \u0432 Android-\u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Android. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c code style, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0443\u0437\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430, \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0442\u044c code review \u0438 \u0442. \u0434. Android Studio (\u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0443\u0434\u0438\u044f) \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u043d\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u0435\u0443\u0447\u0442\u0451\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u043e Lint, \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0438 \u043a\u0430\u043a \u0440\u0435\u0448\u0430\u043b\u0438. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u0435\u043c\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043a\u0443\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u043d\u0435\u0439.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e Lint, \u0430 \u043d\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 Detekt \u0438 Ktlint? <\/p>\n<p>\u0412\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u0442\u0435\u043c\u0443, \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u00ab\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435\u00bb \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041d\u0438\u0447\u0442\u043e \u043d\u0435\u00a0\u043c\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Detekt, \u0442\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441. <\/p>\n<p>\u0412\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u0435\u0441\u043b\u0438 \u0443\u00a0\u0432\u0430\u0441 \u0432\u00a0\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0437\u044f\u0442\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a\u00a0\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c (\u0442\u0430\u043a \u0441\u0435\u0431\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d).<\/p>\n<p>\u0412\u00a0\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u0435\u0441\u043b\u0438 \u0443\u00a0\u0432\u0430\u0441 \u0432\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c Lint \u0438 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u00ab\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u00bb, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u043b\u0438 (\u043d\u0435 \u0434\u0430\u0439 \u0431\u043e\u0433, \u043a\u043e\u043d\u0435\u0447\u043d\u043e) \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u043b\u0441\u044f Java-\u043a\u043e\u0434. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, Lint \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b, Gradle-\u0444\u0430\u0439\u043b\u044b, \u0444\u0430\u0439\u043b\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0435\u0449\u0451. \u041d\u0443 \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u044d\u0442\u043e\u00a0\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438, \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0Lint&#8217;e. <\/p>\n<p>\u041d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u00a0\u0442\u043e\u043c, \u0434\u043b\u044f\u00a0\u0447\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b. \u041a\u0440\u0430\u0442\u043a\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u043a\u0430\u043a\u00a0Lint \u0443\u0441\u0442\u0440\u043e\u0435\u043d, \u0438\u0437\u00a0\u043a\u0430\u043a\u0438\u0445 \u00ab\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439\u00bb \u0441\u043e\u0441\u0442\u043e\u0438\u0442, \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043e\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0435\u0433\u043e \u0432\u00a0\u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u00a0\u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0432\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u0446\u0435\u043f\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0443\u044e \u0438\u0437\u044e\u043c\u0438\u043d\u043a\u0443, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u00a0\u043f\u0438\u0448\u0443\u0442 \u0432\u00a0\u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043f\u0440\u043e\u00a0\u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441\u00a0Lint&#8217;\u043e\u043c.<\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e Lint<\/h2>\n<p>\u0414\u0443\u043c\u0430\u044e, \u043d\u0435 \u043d\u0430\u0434\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0430\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0442\u0430\u043a\u043e\u0435 Lint. \u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u0441\u0435 \u0438\u0437 \u0432\u0430\u0441 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u00a0\u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0435\u0439 \u0432\u00a0\u0441\u0442\u0443\u0434\u0438\u0438. \u0412\u00a0Google \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u043d\u0435\u043f\u043b\u043e\u0445\u0443\u044e<a href=\"https:\/\/developer.android.com\/studio\/write\/lint\">\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a> \u043f\u043e\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u044d\u0442\u0438\u043c\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438. \u0422\u043e \u0435\u0441\u0442\u044c Lint \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438\u00a0\u0441\u0431\u043e\u0440\u043a\u0435 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0433\u043e \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043e\u043f\u044f\u0442\u044c\u00a0\u0436\u0435 \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043c\u043e\u0433\u0443\u0442 \u00ab\u0441\u0444\u0435\u0439\u043b\u0438\u0442\u044c\u00bb \u0441\u0431\u043e\u0440\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435\u00a0\u043f\u0440\u043e\u0448\u043b\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u00a0\u0442\u0438\u043f\u043e\u043c Fatal (\u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3de\/eba\/f82\/3deebaf8289785d505902b85f260633b.png\" alt=\"\u0415\u0441\u043b\u0438 \u043d\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.\" title=\"\u0415\u0441\u043b\u0438 \u043d\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.\" width=\"988\" height=\"530\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3de\/eba\/f82\/3deebaf8289785d505902b85f260633b.png\"\/><\/p>\n<div><figcaption>\u0415\u0441\u043b\u0438 \u043d\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b API Lint&#8217;\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0440\u043e\u0439 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u0435, \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0448\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439. \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u044d\u0442\u043e\u0433\u043e API (\u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b):<\/p>\n<ul>\n<li>\n<p>\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0428\u0438\u0440\u043e\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0434\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435, \u0442\u0430\u043a \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 pre-commit hook\u2019\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437 \u00ab\u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0432\u044b\u0434\u0430\u0451\u0442 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 HTML.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u0432 \u0441\u0442\u0443\u0434\u0438\u0438 \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432\u043a\u0443\u043f\u0435 \u0441 \u0430\u0432\u0442\u043e\u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0438 \u0442. \u0434.).<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1cc\/dab\/d72\/1ccdabd725afb49d21bf16e59f172b53.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043e\u0442\u0447\u0451\u0442\u0430, \u0442\u0430\u043c \u0434\u0430\u0436\u0435 \u0432\u0441\u0451 \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0435.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043e\u0442\u0447\u0451\u0442\u0430, \u0442\u0430\u043c \u0434\u0430\u0436\u0435 \u0432\u0441\u0451 \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0435.\" width=\"1084\" height=\"650\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1cc\/dab\/d72\/1ccdabd725afb49d21bf16e59f172b53.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043e\u0442\u0447\u0451\u0442\u0430, \u0442\u0430\u043c \u0434\u0430\u0436\u0435 \u0432\u0441\u0451 \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0435.<\/figcaption><\/div>\n<\/figure>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442<\/h2>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0451 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, Lint \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0441\u00a0Gradle. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0432\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0435 Java\/Kotlin-\u043c\u043e\u0434\u0443\u043b\u044c (\u043d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0433\u043e \u00ablint\u2011checks\u00bb), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439\/feature\/core-\u043c\u043e\u0434\u0443\u043b\u044c \u0447\u0435\u0440\u0435\u0437 \u00ablintChecks\u00bb. \u0412\u00a0\u044d\u0442\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u00a0\u043b\u0438\u043d\u0442\u0430, \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u043a\u0438. \u0412\u00a0\u0441\u0435\u043a\u0446\u0438\u0438 Android \u2192 Lint \u043c\u043e\u0436\u043d\u043e \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b06\/cb4\/d27\/b06cb4d2731448651a7451be28fbceee.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 Gradle-\u0444\u0430\u0439\u043b \u043c\u043e\u0434\u0443\u043b\u044f \u0441 Lint.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 Gradle-\u0444\u0430\u0439\u043b \u043c\u043e\u0434\u0443\u043b\u044f \u0441 Lint.\" width=\"760\" height=\"746\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b06\/cb4\/d27\/b06cb4d2731448651a7451be28fbceee.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 Gradle-\u0444\u0430\u0439\u043b \u043c\u043e\u0434\u0443\u043b\u044f \u0441 Lint.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a59\/a0a\/788\/a59a0a78889e19721b01d30603683f68.png\" alt=\"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442.\" title=\"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442.\" width=\"482\" height=\"334\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a59\/a0a\/788\/a59a0a78889e19721b01d30603683f68.png\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b\u00a0\u2014 \u043d\u0435\u043a\u0438\u0439 <code>IssueRegistry<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u00a0\u0441\u0435\u043a\u0446\u0438\u044e jar Gradle-\u043c\u043e\u0434\u0443\u043b\u044f lint\u2011checks. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0432\u0430\u0448\u0438\u0445 Issue (\u043e\u0431\u00a0\u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ae7\/929\/b1e\/ae7929b1ee494fca79c26faee81caf39.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 IssueRegistry.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 IssueRegistry.\" width=\"620\" height=\"204\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ae7\/929\/b1e\/ae7929b1ee494fca79c26faee81caf39.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 IssueRegistry.<\/figcaption><\/div>\n<\/figure>\n<h2>Issue<\/h2>\n<p>\u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u044d\u0442\u043e \u00ab\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0448\u0438\u0442\u044c. \u041e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u00a0\u0441\u0435\u0431\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u00ab\u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438\u00bb \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430. \u041f\u043e\u00a0\u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u0432\u043d\u044f\u0442\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u043f\u043e\u00a0\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u043e\u043b\u044f \u0441\u0443\u0433\u0443\u0431\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u043d\u0430\u00a0\u0447\u0442\u043e\u00a0\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u044d\u0442\u043e <code>id<\/code>\u00a0\u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0439 \u0432\u00a0\u0441\u0442\u0443\u0434\u0438\u0438, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 <code>severity<\/code>\u00a0\u2014 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443\u00a0Lint \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b: \u043a\u0430\u043a\u0438\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u00a0\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043a\u043e\u0434\u0430, \u0441\u0442\u043e\u0438\u0442\u00a0\u043b\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u0438\u00a0\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438. \u041a\u0430\u043a\u00a0\u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0434\u043b\u044f\u00a0<code>Severity.Fatal<\/code> \u0441\u0431\u043e\u0440\u043a\u0430 \u0440\u0435\u043b\u0438\u0437\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0434\u0430\u0442\u044c \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u043e\u00a0\u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u00a0\u0441\u0435\u0431\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0b0\/672\/30b\/0b067230b15665c36f11b4d873cc1ac6.png\" alt=\"\u041a\u043b\u0430\u0441\u0441 Issue, \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.\" title=\"\u041a\u043b\u0430\u0441\u0441 Issue, \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.\" width=\"736\" height=\"708\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b0\/672\/30b\/0b067230b15665c36f11b4d873cc1ac6.png\"\/><\/p>\n<div><figcaption>\u041a\u043b\u0430\u0441\u0441 Issue, \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c <code>Implementation<\/code> \u0432 <code>Issue<\/code>, \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0442\u0430\u043a\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u0430\u043a <code>Scope<\/code>. \u041e\u043d\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0443 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u044b \u0441 \u043a\u043e\u0434\u043e\u043c.\u00a0<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/582\/cff\/3e5\/582cff3e550406cfcb60f29ff16e1111.png\" alt=\"\u041d\u0430\u0431\u0440\u043e\u0441\u0430\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 Issue.\" title=\"\u041d\u0430\u0431\u0440\u043e\u0441\u0430\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 Issue.\" width=\"476\" height=\"368\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/582\/cff\/3e5\/582cff3e550406cfcb60f29ff16e1111.png\"\/><\/p>\n<div><figcaption>\u041d\u0430\u0431\u0440\u043e\u0441\u0430\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 Issue.<\/figcaption><\/div>\n<\/figure>\n<h2>Detector<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435\u00a0\u2014 \u043a\u043b\u0430\u0441\u0441, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 Scanner&#8217;\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u043d\u0435\u0435 Scope. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>UastScanner<\/code>\u00a0\u2014 \u0441\u043a\u0430\u043d\u0435\u0440 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u0443 \u0438 <code>XmlScanner<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/370\/7ef\/260\/3707ef260a3d22fe9f85395ee2597b4b.png\" alt=\"\u041a \u0441\u043b\u043e\u0432\u0443, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u043c-\u043d\u0438\u0431\u0443\u0434\u044c.\" title=\"\u041a \u0441\u043b\u043e\u0432\u0443, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u043c-\u043d\u0438\u0431\u0443\u0434\u044c.\" width=\"878\" height=\"446\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/370\/7ef\/260\/3707ef260a3d22fe9f85395ee2597b4b.png\"\/><\/p>\n<div><figcaption>\u041a \u0441\u043b\u043e\u0432\u0443, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u043c-\u043d\u0438\u0431\u0443\u0434\u044c.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0441\u0435 Detector&#8217;\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u00abvisitor pattern\u00bb (\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>UastVisitor<\/code>), \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u0438\u0439 callback, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u00a0\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e Scope (\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435). \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u00a0<code>Issue<\/code> \u043a\u0430\u043a\u00a0<code>JAVA_FILE_SCOPE<\/code>, \u0432\u00a0\u043d\u043e\u0432\u043e\u043c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442\u00a0<code>UastScanner<\/code>, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>getApplicableUastTypes<\/code>, \u0433\u0434\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b (\u0443\u0437\u043b\u044b), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c. \u0421\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <code>UMethod<\/code>. \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c <code>visitMethod<\/code>. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a\u00a0\u0443\u00a0\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430, \u0442\u0430\u043a \u0438 \u0432\u00a0<code>UElementHandler<\/code>, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439\u00a0\u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u00a0\u0431\u0430\u0437\u043e\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430. \u0412\u044b\u0437\u043e\u0432 <code>super<\/code> \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u0430\u00a0\u043c\u0435\u0442\u043e\u0434 <code>visit<\/code> \u0434\u043e\u043b\u0436\u0435\u043d\u00a0\u0431\u044b\u0442\u044c \u0434\u043b\u044f\u00a0\u0443\u0437\u043b\u0430, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u00a0<code>getApplicableUastTypes<\/code> (\u0438\u043d\u0430\u0447\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u0438\u0434\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0442\u044c \u043f\u043e\u00a0\u0432\u0441\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043a\u0438\u0434\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0447\u0442\u043e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0438 \u0437\u0430\u0440\u0435\u043f\u043e\u0440\u0442\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0415\u0449\u0451 \u0440\u0430\u0437: \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 (\u0443\u0437\u043b\u044b) \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0435 \u043c\u0435\u0442\u043e\u0434, \u0447\u0442\u043e\u00a0\u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u00a0\u044d\u0442\u0438 \u0443\u0437\u043b\u044b \u043f\u043e\u043f\u0430\u043b\u0438 \u043f\u0440\u0438\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/961\/492\/926\/961492926210eeff0f029f078ea6c158.png\" alt=\"\u041d\u0430\u0448 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c.\" title=\"\u041d\u0430\u0448 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c.\" width=\"980\" height=\"514\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/961\/492\/926\/961492926210eeff0f029f078ea6c158.png\"\/><\/p>\n<div><figcaption>\u041d\u0430\u0448 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>report<\/code> \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0443\u0437\u043b\u0430, \u043c\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0442\u0438\u0442\u044c \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044e. \u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c LintFix (\u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0447\u0442\u043e \u0441\u0442\u0443\u0434\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u043e\u0434 \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u043e\u0439).\u00a0LintFix \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u043b\u0438 \u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u0430\u0432\u043a\u0443 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 IDE. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u0443 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b, \u043c\u0435\u043d\u044f\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/385\/ba7\/be3\/385ba7be3b852b1e810f6978d281195b.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 LintFix'a, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0434\u0438\u043d \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0432 \u043a\u043e\u0434\u0435.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 LintFix'a, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0434\u0438\u043d \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0432 \u043a\u043e\u0434\u0435.\" width=\"674\" height=\"336\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/385\/ba7\/be3\/385ba7be3b852b1e810f6978d281195b.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 LintFix&#8217;a, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0434\u0438\u043d \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0432 \u043a\u043e\u0434\u0435.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/361\/498\/633\/361498633545b508ed28f35ec4530b5d.png\" alt=\"\u0414\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 accept \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d &quot;visitor&quot;-\u043c\u0435\u0442\u043e\u0434.\" title=\"\u0414\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 accept \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d &quot;visitor&quot;-\u043c\u0435\u0442\u043e\u0434.\" width=\"706\" height=\"164\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/361\/498\/633\/361498633545b508ed28f35ec4530b5d.png\"\/><\/p>\n<div><figcaption>\u0414\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 accept \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u00abvisitor\u00bb\u2011\u043c\u0435\u0442\u043e\u0434.<\/figcaption><\/div>\n<\/figure>\n<p>Detector&#8217;\u044b \u0438 LintFix&#8217;\u044b \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e Lint \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c UAST. \u041e\u0434\u043d\u0430\u043a\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u044c lint-checks \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438 \u043f\u0440\u043e \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u0430 \u043c\u044b \u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0438\u0445 \u0442\u0443\u0434\u0430 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0438\u0442\u044c), \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u0444\u0430\u0439\u043b\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0442. \u0434., \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438, \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u0438\u043a\u0438 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438 \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u0430 \u043d\u0430 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>TestLintTask<\/code> \u0438 \u0432 \u043d\u0451\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 <code>Issue<\/code> \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0422\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432, \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0443 \u043d\u0430\u0441\u00a0\u2014 <code>allowMissingSdk()<\/code>. \u0414\u0430\u043b\u0435\u0435 \u0432 <code>lintTask<\/code> \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0441 \u043a\u043e\u0434\u043e\u043c \u0438\u043b\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0442\u0430\u0431\u044b \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <code>run()<\/code> \u0438 \u0432 <code>expect()<\/code> \u0438 <code>expectFixDiffs()<\/code> \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u043e\u0442\u0447\u0451\u0442 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0438\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e (\u043a\u0430\u043a \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445, \u0442\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/386\/b4a\/46b\/386b4a46b20b3639b10b2b7d5add4671.png\" alt=\"\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u0442\u0430\u0431\u044b \u0438 LintTask.\" title=\"\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u0442\u0430\u0431\u044b \u0438 LintTask.\" width=\"788\" height=\"632\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/386\/b4a\/46b\/386b4a46b20b3639b10b2b7d5add4671.png\"\/><\/p>\n<div><figcaption>\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u0442\u0430\u0431\u044b \u0438 LintTask.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fc7\/530\/1cb\/fc75301cbf535358fa8c70b1a2743fb3.png\" alt=\"\u041f\u043e\u0434\u0441\u0443\u043d\u0443\u043b\u0438 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438.\" title=\"\u041f\u043e\u0434\u0441\u0443\u043d\u0443\u043b\u0438 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438.\" width=\"940\" height=\"510\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fc7\/530\/1cb\/fc75301cbf535358fa8c70b1a2743fb3.png\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0434\u0441\u0443\u043d\u0443\u043b\u0438 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438.<\/figcaption><\/div>\n<\/figure>\n<h2>AST \u0438 PSI<\/h2>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 <code>UastScanner<\/code>. \u0422\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 UAST \u0438 \u043a\u0430\u043a \u043e\u043d\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u044f\u0441\u044c \u0432 \u0434\u0435\u0442\u0430\u043b\u0438, \u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043a\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0430\u043f\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 (\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0442\u0430-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439). <\/p>\n<p>\u0422\u043e, \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0441\u0442\u0443\u0434\u0438\u0438, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 PSI (Programming Structure Interface). \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u043a\u043e\u0434\u0430. \u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451, \u0447\u0442\u043e \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435: \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u0422\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e PSI \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (Kotlin \u0438 Java, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. \u0412 \u0441\u0442\u0443\u0434\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d PsiViewer, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c PSI \u043b\u044e\u0431\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (\u043f\u043e\u043b\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u043d\u0430\u043c \u044d\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u043e\u0437\u0436\u0435).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9e6\/0e6\/837\/9e60e683723c0320495efe416c7daf89.png\" alt=\"\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043b\u0430\u0433\u0438\u043d PsiViewer.\" title=\"\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043b\u0430\u0433\u0438\u043d PsiViewer.\" width=\"724\" height=\"750\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e6\/0e6\/837\/9e60e683723c0320495efe416c7daf89.png\"\/><\/p>\n<div><figcaption>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043b\u0430\u0433\u0438\u043d PsiViewer.<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (AST). \u042d\u0442\u043e \u0442\u043e\u0436\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0434\u0435\u0440\u0435\u0432\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435, \u043d\u043e \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u0434\u043b\u044f \u043d\u0430\u0441. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c AST \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a PSI (\u043d\u0443 \u0438\u043b\u0438 \u043c\u044b \u043d\u0435 \u043d\u0430\u0448\u043b\u0438), \u0442\u0443\u0442 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0442\u0435\u0441\u0442\u044b, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c breakpoint \u043d\u0430 \u0443\u0437\u043b\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/90f\/19d\/58b\/90f19d58b55235f33fc5df9de716384d.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 AST \u0432 \u0436\u0443\u0440\u043d\u0430\u043b.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 AST \u0432 \u0436\u0443\u0440\u043d\u0430\u043b.\" width=\"1256\" height=\"376\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/90f\/19d\/58b\/90f19d58b55235f33fc5df9de716384d.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 AST \u0432 \u0436\u0443\u0440\u043d\u0430\u043b.<\/figcaption><\/div>\n<\/figure>\n<p>\u0418 \u0432\u043e\u0442 \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a Universal AST. UAST \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0435\u043a\u0443\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 AST \u0432 Kotlin \u0438 Java. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430 Kotlin, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0432 AST \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0438\u0437 Java, \u043a \u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u0431\u044b\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438.<\/p>\n<p>\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 UAST\u00a0\u2014 <code>UElement<\/code>, \u043e\u0442\u00a0\u043d\u0435\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u00ab\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\u00bb. \u0412\u00a0API Lint&#8217;\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a\u00a0UAST, \u0442\u0430\u043a \u0438 PSI, \u043a\u0430\u043a\u00a0\u0443\u0433\u043e\u0434\u043d\u043e \u0438\u0445 \u0434\u0440\u0443\u0433 \u0441\u00a0\u0434\u0440\u0443\u0433\u043e\u043c \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 PSI (\u043e\u0431\u044b\u0447\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 code style, \u043d\u0443 \u0438\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0435\u0440\u0435\u0437 PSIViewer), \u0430 \u0447\u0442\u043e\u2011\u0442\u043e\u00a0\u2014 \u0447\u0435\u0440\u0435\u0437 AST (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0447\u0442\u043e-\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u043a \u0442\u0438\u043f\u0443 <code>property<\/code>).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/032\/0d4\/902\/0320d4902172dbdb2d9911081dc3a514.png\" alt=\"\u0418\u043d\u0442\u0435\u0440\u043e\u043f \u0432 PSI \u0437\u0430\u043b\u043e\u0436\u0435\u043d \u043f\u0440\u044f\u043c\u043e \u0432 UElement.\" title=\"\u0418\u043d\u0442\u0435\u0440\u043e\u043f \u0432 PSI \u0437\u0430\u043b\u043e\u0436\u0435\u043d \u043f\u0440\u044f\u043c\u043e \u0432 UElement.\" width=\"1070\" height=\"748\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/032\/0d4\/902\/0320d4902172dbdb2d9911081dc3a514.png\"\/><\/p>\n<div><figcaption>\u0418\u043d\u0442\u0435\u0440\u043e\u043f \u0432 PSI \u0437\u0430\u043b\u043e\u0436\u0435\u043d \u043f\u0440\u044f\u043c\u043e \u0432 UElement.<\/figcaption><\/div>\n<\/figure>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b<\/h2>\n<p>\u0421 \u0430\u0437\u0430\u043c\u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432. \u041f\u0438\u0441\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u00ab\u0432 \u043b\u043e\u0431\u00bb, \u043a\u0430\u043a\u00a0\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0449\u0435, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u00a0\u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437. <\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 1<\/h4>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b <code>UseCase<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0430\u00a0\u043d\u0438\u0445 \u043d\u0435\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u0435\u0441\u0442\u044b. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u00a0\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u0438 \u0444\u0430\u0439\u043b\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <\/p>\n<p>\u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c <code>Issue<\/code> \u0438 <code>Detector<\/code>. \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442\u00a0<code>UastScanner<\/code>, \u0432\u00a0<code>getApplicableUastTypes<\/code> \u0443\u00a0\u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 <code>listOf(UClass::class.java)<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e\u0441\u043e\u0431\u043e \u043d\u0435\u0442, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e\u00a0\u043d\u0430\u043c \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c, \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0438 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0412\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u0435 <code>context<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c <code>requestRepeat<\/code>, \u0430\u00a0\u0447\u0435\u0440\u0435\u0437 <code>phase<\/code> \u0443\u0437\u043d\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u00a0\u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c, \u0435\u0441\u0442\u044c\u00a0\u043b\u0438 \u0442\u0430\u043c \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f (\u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u00a0\u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <code>UseCase<\/code> \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u043c\u044f \u0442\u0435\u0441\u0442\u0430).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2d7\/ff7\/5c9\/2d7ff75c9eecc1b2e0105657dcf35d44.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0441 requestRepeat. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u043e \u043c\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0441 requestRepeat. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u043e \u043c\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.\" width=\"1000\" height=\"734\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2d7\/ff7\/5c9\/2d7ff75c9eecc1b2e0105657dcf35d44.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0441 requestRepeat. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u043e \u043c\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043a\u0443\u0447\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432: \u043a\u043e\u0433\u0434\u0430 \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0451 \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u043d\u043e \u0438\u00a0\u0442.\u00a0\u0434. \u0414\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c \u043a\u0430\u043a\u2011\u0442\u043e \u043f\u0440\u043e\u0449\u0435. \u0415\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c <code>JavaContext<\/code>, \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0433\u043b\u0430\u0437\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 <code>project<\/code>, \u0430\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0447\u0443\u0434\u0435\u0441\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>getTestSourceFolders<\/code>. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u00a0\u0432\u0441\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u043c. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u043e\u0447\u043a\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u043d\u0435\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u043b\u0438\u00a0\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0430\u00a0\u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u044b Kotlin, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c <code>isKotlinFile<\/code>. \u041d\u0443 \u0432\u043e\u0442, \u0435\u0441\u043b\u0438 \u0443\u00a0\u043d\u0430\u0441 \u043d\u0435\u0442 \u0432\u00a0\u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c <code>sourceSet<\/code>&#8216;e \u0444\u0430\u0439\u043b\u0430 \u0441\u00a0\u0438\u043c\u0435\u043d\u0435\u043c, \u043a\u0430\u043a\u00a0\u0443\u00a0\u043d\u0430\u0448\u0435\u0433\u043e <code>UseCase<\/code> + \u00abTest\u00bb \u043d\u0430\u00a0\u043a\u043e\u043d\u0446\u0435,\u00a0\u2014 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u043c \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435. <\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">class UseCaseTestDetector : Detector(), Detector.UastScanner {      companion object {         private const val MESSAGE = \"\u042e\u0437\u043a\u0435\u0439\u0441 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u043c\\n\"          private val lintCategory = LintCategory.Default()         val ISSUE = Issue.create(             id = \"UseCaseTest\",             briefDescription = \"\u041d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\",             explanation = MESSAGE,             category = lintCategory.category,             priority = lintCategory.priorityLevel,             severity = lintCategory.severity,             implementation = Implementation(                 UseCaseTestDetector::class.java,                 Scope.JAVA_FILE_SCOPE             )         )     }      override fun getApplicableUastTypes(): List&lt;Class&lt;out UElement>> = listOf(UClass::class.java)      override fun createUastHandler(context: JavaContext): UElementHandler {         return object : UElementHandler() {              override fun visitClass(node: UClass) {                 if (node.isInterface || node.modifierList?.hasModifierProperty(PsiModifier.ABSTRACT) == true)                     return                 val originalName = node.name.orEmpty().removeSuffix(\"Impl\")                 if (originalName.endsWith(\"UseCase\")                     || originalName.endsWith(\"UseCaseImpl\")                 ) {                     val testFileNames = getAllTestFileNames(context.project.testSourceFolders)                     if (!testFileNames.contains(originalName + \"Test.kt\")                         &amp;&amp; !testFileNames.contains(originalName + \"ImplTest.kt\")                     ) {                         context.report(                             ISSUE,                             node,                             context.getNameLocation(node),                             MESSAGE                         )                     }                 }             }         }     }      \/\/\u041f\u043e\u0438\u0441\u043a \u0432\u0441\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u043e\u0434\u0443\u043b\u044f, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439     private fun getAllTestFileNames(files: List&lt;File>): List&lt;String> {         val names = mutableListOf&lt;String>()         files.forEach {             if (it.isKotlinFile(listOf(\"kt\")))                 names.add(it.name)             else if (it.isDirectory) {                 names.addAll(getAllTestFileNames(it.listFiles().toList()))             }         }         return names     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c <code>context.getNameLocation(node)<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 IDE. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u044d\u0442\u043e \u0443\u0436\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043d\u0435\u0439\u043c\u0438\u043d\u0433), \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0451.  <\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 2<\/h4>\n<p>\u041e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430\u0448 <code>UseCase<\/code>, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u043f\u043e\u043c\u0435\u0447\u0435\u043d \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 <code>Singleton<\/code>, \u0438\u043c\u0435\u0435\u0442 \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0441 \u0442\u0438\u043f\u043e\u043c <code>Observable<\/code> \u0438\u0437 RxJava (\u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0432\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u0445\u043e\u0442\u0435\u043b\u0438\u00a0\u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0432\u00a0<code>UseCase<\/code> \u043e\u0442\u00a0\u043b\u044e\u0431\u044b\u0445 \u00ab\u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432\u00bb, \u0442\u0430\u043a \u0447\u0442\u043e\u00a0\u0442\u0430\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a). \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0431\u0435\u0437\u00a0\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>visitClass()<\/code>. <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u00a0\u043f\u043e\u0440\u044f\u0434\u043a\u0443: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, <code>UClass<\/code> \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0443\u0447\u0443 \u0440\u0430\u0437\u043d\u044b\u0445 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0432\u00a0\u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 <code>annotations<\/code>, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u00a0\u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043f\u0443\u0442\u0438 (\u0432 PSI \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0442).<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">node.annotations.find { it.hasQualifiedName(\"javax.inject.Singleton\") }?.let {     context.report(           issue = ISSUE,           scopeClass = node,           location = context.getLocation(it),           message = SINGLETON_MESSAGE     ) }               <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0438\u0449\u0435\u043c \u0447\u0435\u0440\u0435\u0437 PSI. \u0422\u0443\u0442 \u0442\u043e\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u0440\u043e \u043d\u0438\u0445 \u043d\u0435 \u0437\u043d\u0430\u043b\u0438 \u0438 \u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0438\u043d\u043e\u0433\u0434\u0430 \u0442\u0430\u043a \u0445\u043e\u0442\u044c \u0438 \u043d\u0435\u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043d\u043e \u043f\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0435\u0435, \u0442\u0443\u0442 \u0443\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <code>findDescendantOfType<\/code>, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0438\u0437\u00a0<code>UClass<\/code> \u043e\u0431\u044a\u0435\u043a\u0442 <code>sourcePsi<\/code>. \u0422\u0438\u043f Descendant&#8217;a \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0435\u0440\u0435\u0437 PsiViewer (\u043d\u0430\u0432\u043e\u0434\u0438\u043c\u0441\u044f \u043d\u0430\u00a0\u043d\u0443\u0436\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435 \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 <code>class<\/code>)\u00a0\u2014 \u044d\u0442\u043e <code>KDocSection<\/code>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">if (node.sourcePsi?.findDescendantOfType&lt;KDocSection>() == null) {       context.report(             issue = ISSUE,             scopeClass = node,             location = context.getNameLocation(node),             message = DOC_MESSAGE       ) }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0425\u043c, \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a\u00a0\u0431\u0443\u0434\u0442\u043e \u044d\u0442\u043e \u0438 \u0437\u0430\u00a0\u043c\u0438\u043d\u0443\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u043e\u0433\u0434\u0430 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u0434\u043e\u043f\u0438\u0448\u0435\u043c. \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e\u00a0\u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u00a0\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441\u00a0\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439,\u00a0\u2014 \u0432\u0438\u0434\u0438\u043c \u0432\u00a0<code>UClass<\/code> <code>fields<\/code>, \u0434\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u043c\u044f. \u0422\u0430\u043a \u0438 \u0434\u0435\u043b\u0430\u0435\u043c, \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442, \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e. \u041d\u0443, \u043d\u0435\u00a0\u0441\u043e\u0432\u0441\u0435\u043c. \u0414\u0435\u043b\u043e \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0<code>UField<\/code> \u0438 <code>property<\/code> \u0432\u00a0Kotlin\u00a0\u2014 \u043d\u0435\u00a0\u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u00a0\u0436\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>companion object<\/code> \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u00a0\u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code>fields<\/code>. \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0435, \u043d\u043e\u00a0\u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0442\u043e\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u0435\u0441\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0447\u0442\u043e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u0430\u0431\u044b\u0442\u044c. \u041f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u043d\u043e\u0432\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u043b\u0443\u0433\u0430\u043c\u0438 PSI (\u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u00a0<code>PsiViewer<\/code>), \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u0441\u043d\u043e\u0432\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u00a0<code>UElement<\/code> \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0443\u0442\u0438 (\u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u00a0\u0438\u043c\u0435\u043d\u0438, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0441\u00a0\u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0432\u00a0\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435). \u041d\u0443 \u0438 \u043a\u0430\u043a\u00a0\u0431\u043e\u043d\u0443\u0441, \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u00a0PSI \u0435\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 <code>isPublic<\/code>, \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u043d\u0430\u0441 \u043e\u0442\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u044d\u0442\u0438\u0445 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">node.sourcePsi   ?.getChildOfType&lt;KtClassBody>()   ?.children   ?.filterIsInstance&lt;KtProperty>()   ?.forEach { property ->     if (property.isPublic) {         val type = (property.toUElementOfType&lt;UMethod>()?.returnType             ?: property.toUElementOfType&lt;UField>()?.type)?.canonicalText.orEmpty()          if (type.contains(\"io.reactivex.Observable\")) {             context.report(                 issue = UseCaseUsageDetector.ISSUE,                 scopeClass = node,                 location = context.getLocation(property),                 message = OBSERVABLES_MESSAGE             )         }     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u0430\u0436\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u043e. \u041d\u043e\u00a0\u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u00ab\u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\u00bb \u0432\u0441\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043b\u043e\u0433\u0438\u043a\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u00a0\u043d\u0435\u043c\u0443 \u043a\u0430\u043a\u00a0\u0432\u0432\u0435\u0440\u0445, \u0442\u0430\u043a \u0438 \u0432\u043d\u0438\u0437. \u0423\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u00a0\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0438 \u043d\u0430\u00a0\u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0442\u0435\u0439, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u00a0\u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e\u0435, \u043f\u0440\u0438\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u0430\u0441\u0442\u0443\u044f \u043a\u00a0\u043a\u0430\u043a\u043e\u043c\u0443\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u043b\u0430\u0441\u0441\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. <\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 3<\/h4>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0435\u00a0\u043a\u0430\u0441\u0442\u043e\u0432\u0430\u0442\u044c \u043a\u00a0\u043a\u0430\u043a\u0438\u043c\u2011\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0430\u043c, \u0430\u00a0\u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u043a\u0430\u043a\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0438\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0434\u0430\u0436\u0435\u00a0\u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435: \u043b\u044e\u0431\u043e\u0439 PSI-\u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>text<\/code>, \u043a\u0443\u0434\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u0434\u0435\u0440\u0435\u0432\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u00a0\u0442\u0438\u043f\u0438\u0447\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e\u00a0\u0443\u00a0\u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f if\/else \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u043e\u044f\u0442 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438 \u0434\u043b\u044f\u00a0\u0442\u0435\u043b\u0430, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0410\u00a0\u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 LintFix&#8217;a, \u043d\u0443 \u0438 \u0434\u0430\u0432\u043d\u0435\u043d\u044c\u043a\u043e \u0447\u0442\u043e\u2011\u0442\u043e \u043c\u044b \u0442\u0435\u0441\u0442\u044b \u043d\u0435\u00a0\u043f\u0438\u0441\u0430\u043b\u0438. <\/p>\n<p>\u0412\u00a0<code>getApplicableUastTypes<\/code> \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u0442\u0438\u043f \u043d\u0430\u00a0<code>UIfExpression<\/code>, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>visitIfExpression<\/code>. \u0421\u0440\u0430\u0437\u0443 \u0443\u0431\u0435\u0440\u0451\u043c \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u044d\u043b\u0432\u0438\u0441\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043d\u0435\u00a0\u043c\u0435\u0448\u0430\u043b\u0438. \u0414\u0430\u043b\u0435\u0435, \u043f\u043e\u00a0\u0443\u043c\u0443, \u043d\u0430\u043c\u00a0\u0431\u044b \u0432\u044b\u0443\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0438 \u043a\u0430\u043a\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u044b (\u043e\u043d\u0438 \u0432\u00a0API \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f Leaf \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0\u043d\u0438\u043c\u0438 \u043d\u0435\u00a0\u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e), \u043d\u043e\u00a0\u0442\u0443\u0442 \u043f\u043e\u0447\u0435\u043c\u0443\u2011\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0443\u00a0\u0431\u043b\u043e\u043a\u0430 <code>then<\/code> \u0438 <code>else<\/code>, \u0442\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u0432\u00a0<code>PsiViewer<\/code>, \u043c\u044b \u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c, \u0447\u0442\u043e\u00a0\u0441\u043a\u043e\u0431\u043a\u0438 (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c)\u00a0\u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u00a0\u0442\u0435\u043b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0411\u044b\u0441\u0442\u0440\u043e \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f \u0432\u00a0\u044d\u0442\u043e\u043c, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 <code>text<\/code> \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043f\u0440\u043e\u0449\u0435 \u043d\u0435\u043a\u0443\u0434\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">override fun visitIfExpression(node: UIfExpression) {     if (node.isTernary || node.uastParent is KotlinUElvisExpression) return        val thenExpression = node.thenExpression ?: return     val elseExpression = node.elseExpression        if (thenExpression.sourcePsi?.firstChild?.text.orEmpty() != \"{\"         &amp;&amp; thenExpression.sourcePsi?.lastChild?.text.orEmpty() != \"}\"         || elseExpression != null         &amp;&amp; elseExpression.sourcePsi?.firstChild?.text.orEmpty() != \"{\"         &amp;&amp; elseExpression.sourcePsi?.lastChild?.text.orEmpty() != \"}\"     ) {         val sourcePsi = node.sourcePsi         if (sourcePsi != null &amp;&amp; !isMaxSymbolsCondition(sourcePsi) &amp;&amp; sourcePsi.text.lines().size == 1) {             return         } else {             context.report(                 issue = CurlyBracketsInConditionsDetector.ISSUE,                 scope = node,                 location = context.getLocation(node),                 message = CurlyBracketsInConditionsDetector.MESSAGE,                 quickfixData = buildIfQuickFix(node, context.getLocation(node), thenExpression)             )         }     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0432\u00a0\u0441\u0442\u0443\u0434\u0438\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u0443 \u043a\u043e\u0434\u0430 \u0431\u0435\u0437\u00a0\u0441\u043a\u043e\u0431\u043e\u043a \u043d\u0430\u00a0\u043a\u043e\u0434 \u0441\u043e \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c LintFix. \u0421\u0443\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043c\u0435\u0441\u0442\u043e \u0432\u00a0\u043a\u043e\u0434\u0435 \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0432\u0441\u0451 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u00a0\u043d\u043e\u0432\u043e\u0435, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0441\u043a\u043e\u0431\u043a\u0438 \u043a\u0430\u043a\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u0430\u0432\u0442\u043e\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u00ab\u043e\u043b\u0434\u0441\u043a\u0443\u043b\u044c\u043d\u043e\u00bb, \u043d\u043e\u00a0\u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0438 \u0432\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435, \u0430\u00a0\u0433\u043b\u0430\u0432\u043d\u043e\u0435\u00a0\u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">private fun buildIfQuickFix(             node: UIfExpression,             location: Location,             thenExpression: UExpression     ): LintFix =         fix()             .replace()             .range(location)             .name(\"\u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\")             .with(                 buildIfQuickFixString(                     node,                     thenExpression                 )             )             .reformat(true)             .build()  private fun buildIfQuickFixString(             node: UIfExpression,             thenExpression: UExpression,     ): String {         val elseExpression = node.elseExpression         val isNeedThenExpressionFirstBrace = thenExpression.sourcePsi?.firstChild?.text != \"{\"         val isNeedThenExpressionLastBrace = thenExpression.sourcePsi?.lastChild?.text != \"}\"         return buildString {             append(\"if(\")             append(node.condition.sourcePsi?.text)             append(\")\")             append(if (isNeedThenExpressionFirstBrace) \"{\\n\" else \"\")             append(thenExpression.sourcePsi?.text)             append(if (isNeedThenExpressionLastBrace) \"\\n}\" else \"\")             if (elseExpression != null) {                 val isNeedElseExpressionFirstBrace = elseExpression.sourcePsi?.firstChild?.text != \"{\"                 val isNeedElseExpressionLastBrace = elseExpression.sourcePsi?.lastChild?.text != \"}\"                 append(\"\\nelse\")                 append(if (isNeedElseExpressionFirstBrace) \"{\\n\" else \"\")                 append(elseExpression.sourcePsi?.text)                 append(if (isNeedElseExpressionLastBrace) \"\\n}\" else \"\")             }         }     }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0432\u044b\u0432\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0444\u0438\u043a\u0441\u0430, \u043d\u043e\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u0437\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0430\u0442\u044c. \u0414\u043b\u044f\u00a0\u0442\u0435\u0441\u0442\u0430 LintFix&#8217;a, \u043a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442, \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u00a0\u2014 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0437 \u00ab&lt;Click to see difference>\u00bb \u0432\u00a0\u043b\u043e\u0433\u0435 \u0438\u0437\u00a0\u043e\u0448\u0438\u0431\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u0441\u0442 \u0443\u043f\u0430\u0434\u0451\u0442, \u0443\u0431\u0435\u0434\u0438\u0432\u0448\u0438\u0441\u044c \u0432\u00a0\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e. \u0422\u043e \u0435\u0441\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0438, \u0447\u0442\u043e\u00a0\u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u00ab\u2011\u00bb, \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u044b, \u0430\u00a0\u0441 \u00ab+\u00bb\u00a0\u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b. \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e\u00a0\u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c, \u0430\u00a0\u0441\u043c\u044b\u0441\u043b \u0438 \u00ab\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c\u00bb \u043d\u0435\u00a0\u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0430 (\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u00a0\u0432\u00a0\u0441\u0447\u0451\u0442, \u043e\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f).<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">class CurlyBracketsInConditionsDetectorTest {      private val lintTask = TestLintTask         .lint()         .allowMissingSdk()         .issues(CurlyBracketsInConditionsDetector.ISSUE)      @Test     fun curlyBracketsInIfConditionsTest() {         lintTask             .files(                 kotlin(                     \"\"\"                         package com.example.examplelint                          class Name{                                                      fun test() {                                 null ?: 0                                  if (true) {                                     foo()                                  } else {                                     bar()                                  }                                  if (true) foo() else bar()                                  if (true)                                     foo()                                 else                                     bar()                             }                                                      fun foo() {}                             fun bar() {}                         }                     \"\"\"                 )             )             .testModes(TestMode.BODY_REMOVAL)             .run()             .expect(                 \"\"\"                     src\/com\/example\/examplelint\/Name{.kt:9: Error: \u0422\u0435\u043b\u043e \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0432 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438 [CurlyBracketsInConditions]                                                     if (true)                                                      ^                     1 errors, 0 warnings                 \"\"\".trimIndent()             )             .expectFixDiffs(                 \"\"\"                     NOTE: The following is specific to test mode \"Body Removal\" (TestMode.BODY_REMOVAL) :                      Fix for src\/com\/example\/examplelint\/Name{.kt line 9: \u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c:                     @@ -9 +9                     - if (true)                     -    foo()                     - else                     -    bar()                     + if(true){                     + foo()                     + }                     + else{                     + bar()                     + }                 \"\"\".trimIndent()             )     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 4<\/h4>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0451 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043f\u0440\u043e \u043d\u0430\u0448\u0438 \u043b\u044e\u0431\u0438\u043c\u044b\u0435 XML. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u0442\u0440\u043e\u043a\u0438, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u0445, \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437 Figma. \u0422\u0443\u0442 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 <code>ResourceXmlDetector<\/code> \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>Scope.RESOURCE_FILE_SCOPE<\/code>. \u0414\u043b\u044f \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b:<\/p>\n<ul>\n<li>\n<p><code>getApplicableAttributes<\/code>\u00a0\u2014 \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0434\u0430\u0451\u043c \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c. \u042d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f\u00a0\u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 (\u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0451 \u0435\u0449\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e\u00a0\u0432\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 <code>background<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0435\u00a0\u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u00ab\u0441\u044b\u0440\u043e\u0439\u00bb \u043a\u043e\u0434 \u0446\u0432\u0435\u0442\u0430, \u0430\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438\u0437\u00a0\u0434\u0438\u0437\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/li>\n<li>\n<p><code>getApplicableElements<\/code>\u00a0\u2014 \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u00abstring\u00bb, \u00abplurals\u00bb, \u00abdimen\u00bb \u0438\u00a0\u0442.\u00a0\u0434. <\/p>\n<\/li>\n<li>\n<p><code>appliesTo<\/code>\u00a0\u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>ResourceFolderType.DRAWABLE<\/code>. <\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, <code>getApplicableElements<\/code>\u00a0\u2014 <code>setOf(\"string\", \"plurals\")<\/code>, <code>appliesTo<\/code>\u00a0\u2014 <code>ResourceFolderType.VALUES.<\/code> \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c Visitor&#8217;\u044b. \u041a\u043b\u0430\u0441\u0441 <code>ResourceXmlDetector<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u043c <code>visitAttribute<\/code>, <code>visitElement<\/code> \u0438 <code>visitDocument<\/code> (\u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e). \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043d\u0435\u044f\u0432\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441, \u043f\u0440\u0438\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432: \u043c\u0435\u0442\u043e\u0434\u044b <code>visit<\/code> \u043c\u043e\u0433\u0443\u0442 \u043d\u0435\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b \u043d\u0435\u00a0\u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0439\u043c\u0451\u0442\u0435, \u0432\u00a0\u0447\u0451\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435\u00a0\u2014 \u043d\u0435\u00a0\u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043d\u043e\u00a0\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b, \u0442\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c <strong>\u043e\u0431\u0430<\/strong> \u043c\u0435\u0442\u043e\u0434\u0430 (<code>visitAttribute<\/code> \u0438 <code>visitElement<\/code>), \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0434\u043b\u044f\u00a0\u0432\u0430\u0448\u0435\u0433\u043e \u043e\u0442\u0447\u0451\u0442\u0430 \u0432\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e (\u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0443\u0441\u0442\u044b\u043c, \u0431\u0435\u0437\u00a0\u0432\u044b\u0437\u043e\u0432\u0430 <code>super<\/code>).<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">class NonBreakingSpaceDetector : ResourceXmlDetector() {      companion object {         private const val MESSAGE = \"\u0414\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u0440\u0430\u0437\u0440\u044b\u0432\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u0432 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c unicode \u0441\u0438\u043c\u0432\u043e\u043b \\\\u00A0\\n\"          private val lintCategory = LintCategory.Default()         val ISSUE = Issue.create(             id = \"NonBreakingSpace\",             briefDescription = \"\u041d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\",             explanation = MESSAGE,             category = lintCategory.category,             priority = lintCategory.priorityLevel,             severity = lintCategory.severity,             implementation = Implementation(                 NonBreakingSpaceDetector::class.java,                 Scope.RESOURCE_FILE_SCOPE             )         )     }      override fun getApplicableElements(): Collection&lt;String> = setOf(\"string\", \"plurals\")      override fun appliesTo(folderType: ResourceFolderType): Boolean = folderType == ResourceFolderType.VALUES      override fun visitElement(context: XmlContext, element: Element) {         if (element.tagName == \"string\") {             val node = element.firstChild             buildReport(value = node.nodeValue, context = context, location = context.getLocation(node))         } else {             buildReport(value = element.textContent, context = context, location = context.getLocation(element))         }     }      private fun buildReport(value: String, context: XmlContext, location: Location) {         if (value.toLowerCaseAsciiOnly().contains(\"\u00a0\")) {             context.report(                 issue = ISSUE,                 location = location,                 message = MESSAGE,                 quickfixData = buildQuickFix(location)             )         }     }      private fun buildQuickFix(location: Location): LintFix =         fix()             .name(\"\u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\")             .replace()             .range(location)             .text(\"\u00a0\")             .with(\"\\\\u00A0\")             .build() }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e: \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438 \u0438 \u0438\u0434\u0435\u044e, \u0432\u0435\u0440\u0445\u043d\u0435\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u00a0\u2014 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043f\u0430\u0440\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u044d\u0442\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0437\u043d\u0430\u043d\u0438\u0439 \u0438 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432. <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043e\u043d\u0443\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0432\u0435\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0412 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 <code>JavaContext<\/code> \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0448\u0442\u0443\u043a\u0430\u00a0\u2014 <code>evaluator<\/code>, \u0442\u0430\u043c \u043b\u0435\u0436\u0438\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043c\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434\u0430, \u0438\u043b\u0438\u00a0\u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u0434\u0432\u0443\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 (\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0442\u043e\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e).<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043d\u0435\u00a0\u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0432\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043a\u043e\u0434\u0430, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u043a\u0443 \u0432\u00a0\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0435 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u00a0\u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0438\u00a0\u0441\u0442\u0443\u0434\u0438\u0438. \u041d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u00ab:lint\u2011checks:jar\u00bb \u0432\u00a0Gradle, \u043e\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0434\u0441\u0443\u043d\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u00a0jar-\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441\u043e \u0432\u0441\u0435\u043c\u0438\u00a0\u043b\u0438\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0443\u0434\u0438\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u0432\u0441\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043d\u0435\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e\u00a0\u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445. \u0412\u00a0\u044f\u0437\u044b\u043a\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0443\u0447\u0435\u0441\u0442\u044c \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c <code>lintDebug<\/code> \u043d\u0430\u00a0\u043a\u0430\u043a\u0438\u0445\u2011\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0442\u0447\u0451\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p>LintFix&#8217;\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c \u0441\u00a0\u0430\u0432\u0442\u043e\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u0443\u0434\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u00abReformat code\u00bb \u043f\u0440\u0438\u00a0\u043a\u043e\u043c\u043c\u0438\u0442\u0435) \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>autoFix<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u041d\u043e\u00a0\u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437\u0443\u043f\u0440\u0435\u0447\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p><code>Location<\/code> \u0434\u043b\u044f\u00a0\u043e\u0442\u0447\u0451\u0442\u0430 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c\u0441\u044f \u0438\u0437\u00a0\u0443\u0437\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043d\u043e\u00a0\u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b <code>create<\/code> \u0443\u00a0\u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0422\u043e\u043b\u044c\u043a\u043e \u0442\u0443\u0442 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0<code>offset<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043c \u0432\u0435\u0437\u0434\u0435 \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442, \u044d\u0442\u043e \u043e\u0442\u0441\u0442\u0443\u043f \u043e\u0442\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0430\u0439\u043b\u0430 \u0434\u043e\u00a0\u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430, \u0430\u00a0\u043d\u0435\u00a0\u043e\u0442\u00a0\u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430, \u043a\u0430\u043a\u00a0\u043c\u043e\u0436\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0<code>UMethod<\/code>, \u0430\u00a0\u043d\u0435\u00a0\u0432\u0435\u0441\u044c <code>UFile<\/code>, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043a\u043e\u0434\u0430, \u0433\u0434\u0435 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0438\u0437\u00a0\u043a\u043b\u0430\u0441\u0441\u0430 <code>Document<\/code> \u0438\u0437 <code>psiElement.containingFile.viewProvider.document<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/818067\/\"> https:\/\/habr.com\/ru\/articles\/818067\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Android. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c code style, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0443\u0437\u043a\u0438\u0435 \u043c\u0435\u0441\u0442\u0430, \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0442\u044c code review \u0438 \u0442. \u0434. Android Studio (\u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0443\u0434\u0438\u044f) \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u043d\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u0435\u0443\u0447\u0442\u0451\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a\u0440\u0430\u0442\u043a\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u043e Lint, \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0438 \u043a\u0430\u043a \u0440\u0435\u0448\u0430\u043b\u0438. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u0435\u043c\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043a\u0443\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u043d\u0435\u0439.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e Lint, \u0430 \u043d\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 Detekt \u0438 Ktlint? <\/p>\n<p>\u0412\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u0442\u0435\u043c\u0443, \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u00ab\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435\u00bb \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041d\u0438\u0447\u0442\u043e \u043d\u0435\u00a0\u043c\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Detekt, \u0442\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441. <\/p>\n<p>\u0412\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u0435\u0441\u043b\u0438 \u0443\u00a0\u0432\u0430\u0441 \u0432\u00a0\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u0432\u0437\u044f\u0442\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a\u00a0\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c (\u0442\u0430\u043a \u0441\u0435\u0431\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d).<\/p>\n<p>\u0412\u00a0\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u0435\u0441\u043b\u0438 \u0443\u00a0\u0432\u0430\u0441 \u0432\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c Lint \u0438 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u00ab\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u00bb, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u043b\u0438 (\u043d\u0435 \u0434\u0430\u0439 \u0431\u043e\u0433, \u043a\u043e\u043d\u0435\u0447\u043d\u043e) \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u043b\u0441\u044f Java-\u043a\u043e\u0434. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, Lint \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b, Gradle-\u0444\u0430\u0439\u043b\u044b, \u0444\u0430\u0439\u043b\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0435\u0449\u0451. \u041d\u0443 \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u044d\u0442\u043e\u00a0\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438, \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0Lint&#8217;e. <\/p>\n<p>\u041d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u00a0\u0442\u043e\u043c, \u0434\u043b\u044f\u00a0\u0447\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u044b. \u041a\u0440\u0430\u0442\u043a\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u043a\u0430\u043a\u00a0Lint \u0443\u0441\u0442\u0440\u043e\u0435\u043d, \u0438\u0437\u00a0\u043a\u0430\u043a\u0438\u0445 \u00ab\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439\u00bb \u0441\u043e\u0441\u0442\u043e\u0438\u0442, \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043e\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0435\u0433\u043e \u0432\u00a0\u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u00a0\u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0432\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u0446\u0435\u043f\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0443\u044e \u0438\u0437\u044e\u043c\u0438\u043d\u043a\u0443, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u00a0\u043f\u0438\u0448\u0443\u0442 \u0432\u00a0\u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043f\u0440\u043e\u00a0\u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441\u00a0Lint&#8217;\u043e\u043c.<\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e Lint<\/h2>\n<p>\u0414\u0443\u043c\u0430\u044e, \u043d\u0435 \u043d\u0430\u0434\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0430\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0442\u0430\u043a\u043e\u0435 Lint. \u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u0441\u0435 \u0438\u0437 \u0432\u0430\u0441 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u00a0\u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0435\u0439 \u0432\u00a0\u0441\u0442\u0443\u0434\u0438\u0438. \u0412\u00a0Google \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u043d\u0435\u043f\u043b\u043e\u0445\u0443\u044e<a href=\"https:\/\/developer.android.com\/studio\/write\/lint\">\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a> \u043f\u043e\u00a0\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u044d\u0442\u0438\u043c\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438. \u0422\u043e \u0435\u0441\u0442\u044c Lint \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438\u00a0\u0441\u0431\u043e\u0440\u043a\u0435 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0433\u043e \u0442\u0430\u0440\u0433\u0435\u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043e\u043f\u044f\u0442\u044c\u00a0\u0436\u0435 \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043c\u043e\u0433\u0443\u0442 \u00ab\u0441\u0444\u0435\u0439\u043b\u0438\u0442\u044c\u00bb \u0441\u0431\u043e\u0440\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435\u00a0\u043f\u0440\u043e\u0448\u043b\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u00a0\u0442\u0438\u043f\u043e\u043c Fatal (\u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435).<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0415\u0441\u043b\u0438 \u043d\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b API Lint&#8217;\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0440\u043e\u0439 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u0435, \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0448\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439. \u041e\u0442\u043c\u0435\u0442\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u044d\u0442\u043e\u0433\u043e API (\u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b):<\/p>\n<ul>\n<li>\n<p>\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p>\u0428\u0438\u0440\u043e\u043a\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0434\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043a\u0430\u043a \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435, \u0442\u0430\u043a \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 pre-commit hook\u2019\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437 \u00ab\u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0432\u044b\u0434\u0430\u0451\u0442 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 HTML.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u0432 \u0441\u0442\u0443\u0434\u0438\u0438 \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432\u043a\u0443\u043f\u0435 \u0441 \u0430\u0432\u0442\u043e\u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0438 \u0442. \u0434.).<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043e\u0442\u0447\u0451\u0442\u0430, \u0442\u0430\u043c \u0434\u0430\u0436\u0435 \u0432\u0441\u0451 \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0435.<\/figcaption><\/div>\n<\/figure>\n<h2>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442<\/h2>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0451 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, Lint \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0441\u00a0Gradle. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0432\u00a0\u043f\u0440\u043e\u0435\u043a\u0442\u0435 Java\/Kotlin-\u043c\u043e\u0434\u0443\u043b\u044c (\u043d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0433\u043e \u00ablint\u2011checks\u00bb), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439\/feature\/core-\u043c\u043e\u0434\u0443\u043b\u044c \u0447\u0435\u0440\u0435\u0437 \u00ablintChecks\u00bb. \u0412\u00a0\u044d\u0442\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u00a0\u043b\u0438\u043d\u0442\u0430, \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u043a\u0438. \u0412\u00a0\u0441\u0435\u043a\u0446\u0438\u0438 Android \u2192 Lint \u043c\u043e\u0436\u043d\u043e \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 Gradle-\u0444\u0430\u0439\u043b \u043c\u043e\u0434\u0443\u043b\u044f \u0441 Lint.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\">\n<div><figcaption>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b\u00a0\u2014 \u043d\u0435\u043a\u0438\u0439 <code>IssueRegistry<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u00a0\u0441\u0435\u043a\u0446\u0438\u044e jar Gradle-\u043c\u043e\u0434\u0443\u043b\u044f lint\u2011checks. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0432\u0430\u0448\u0438\u0445 Issue (\u043e\u0431\u00a0\u044d\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435).<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 IssueRegistry.<\/figcaption><\/div>\n<\/figure>\n<h2>Issue<\/h2>\n<p>\u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u044d\u0442\u043e \u00ab\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0448\u0438\u0442\u044c. \u041e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u00a0\u0441\u0435\u0431\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u00ab\u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438\u00bb \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430. \u041f\u043e\u00a0\u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u0432\u043d\u044f\u0442\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f, \u043f\u043e\u00a0\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u043e\u043b\u044f \u0441\u0443\u0433\u0443\u0431\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u043d\u0430\u00a0\u0447\u0442\u043e\u00a0\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u044d\u0442\u043e <code>id<\/code>\u00a0\u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0439 \u0432\u00a0\u0441\u0442\u0443\u0434\u0438\u0438, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 <code>severity<\/code>\u00a0\u2014 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443\u00a0Lint \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b: \u043a\u0430\u043a\u0438\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u00a0\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043a\u043e\u0434\u0430, \u0441\u0442\u043e\u0438\u0442\u00a0\u043b\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u0438\u00a0\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438. \u041a\u0430\u043a\u00a0\u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0434\u043b\u044f\u00a0<code>Severity.Fatal<\/code> \u0441\u0431\u043e\u0440\u043a\u0430 \u0440\u0435\u043b\u0438\u0437\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0434\u0430\u0442\u044c \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u043e\u00a0\u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u00a0\u0441\u0435\u0431\u044f.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041a\u043b\u0430\u0441\u0441 Issue, \u0442\u043e\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c <code>Implementation<\/code> \u0432 <code>Issue<\/code>, \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0442\u0430\u043a\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u043a\u0430\u043a <code>Scope<\/code>. \u041e\u043d\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0443 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u044b \u0441 \u043a\u043e\u0434\u043e\u043c.\u00a0<\/p>\n<figure class=\"\">\n<div><figcaption>\u041d\u0430\u0431\u0440\u043e\u0441\u0430\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 Issue.<\/figcaption><\/div>\n<\/figure>\n<h2>Detector<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435\u00a0\u2014 \u043a\u043b\u0430\u0441\u0441, \u0433\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 Scanner&#8217;\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f\u00a0\u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u043d\u0435\u0435 Scope. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>UastScanner<\/code>\u00a0\u2014 \u0441\u043a\u0430\u043d\u0435\u0440 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u0443 \u0438 <code>XmlScanner<\/code>\u00a0\u2014 \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041a \u0441\u043b\u043e\u0432\u0443, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u043c-\u043d\u0438\u0431\u0443\u0434\u044c.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0441\u0435 Detector&#8217;\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u00abvisitor pattern\u00bb (\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>UastVisitor<\/code>), \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u0438\u0439 callback, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u00a0\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e Scope (\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435). \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u00a0<code>Issue<\/code> \u043a\u0430\u043a\u00a0<code>JAVA_FILE_SCOPE<\/code>, \u0432\u00a0\u043d\u043e\u0432\u043e\u043c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442\u00a0<code>UastScanner<\/code>, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>getApplicableUastTypes<\/code>, \u0433\u0434\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b (\u0443\u0437\u043b\u044b), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c. \u0421\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <code>UMethod<\/code>. \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c <code>visitMethod<\/code>. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a\u00a0\u0443\u00a0\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430, \u0442\u0430\u043a \u0438 \u0432\u00a0<code>UElementHandler<\/code>, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439\u00a0\u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u00a0\u0431\u0430\u0437\u043e\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430. \u0412\u044b\u0437\u043e\u0432 <code>super<\/code> \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u0430\u00a0\u043c\u0435\u0442\u043e\u0434 <code>visit<\/code> \u0434\u043e\u043b\u0436\u0435\u043d\u00a0\u0431\u044b\u0442\u044c \u0434\u043b\u044f\u00a0\u0443\u0437\u043b\u0430, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u00a0<code>getApplicableUastTypes<\/code> (\u0438\u043d\u0430\u0447\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u0438\u0434\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0442\u044c \u043f\u043e\u00a0\u0432\u0441\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043a\u0438\u0434\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0447\u0442\u043e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0438 \u0437\u0430\u0440\u0435\u043f\u043e\u0440\u0442\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0415\u0449\u0451 \u0440\u0430\u0437: \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 (\u0443\u0437\u043b\u044b) \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0435 \u043c\u0435\u0442\u043e\u0434, \u0447\u0442\u043e\u00a0\u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u00a0\u044d\u0442\u0438 \u0443\u0437\u043b\u044b \u043f\u043e\u043f\u0430\u043b\u0438 \u043f\u0440\u0438\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041d\u0430\u0448 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>report<\/code> \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0443\u0437\u043b\u0430, \u043c\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0442\u0438\u0442\u044c \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044e. \u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c LintFix (\u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0447\u0442\u043e \u0441\u0442\u0443\u0434\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u043e\u0434 \u043b\u0430\u043c\u043f\u043e\u0447\u043a\u043e\u0439).\u00a0LintFix \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u043b\u0438 \u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u0430\u0432\u043a\u0443 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 IDE. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u0443 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b, \u043c\u0435\u043d\u044f\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 LintFix&#8217;a, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0434\u0438\u043d \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0432 \u043a\u043e\u0434\u0435.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\">\n<div><figcaption>\u0414\u043b\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 accept \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u00abvisitor\u00bb\u2011\u043c\u0435\u0442\u043e\u0434.<\/figcaption><\/div>\n<\/figure>\n<p>Detector&#8217;\u044b \u0438 LintFix&#8217;\u044b \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e Lint \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c UAST. \u041e\u0434\u043d\u0430\u043a\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u044c lint-checks \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438 \u043f\u0440\u043e \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u0430 \u043c\u044b \u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0438\u0445 \u0442\u0443\u0434\u0430 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0438\u0442\u044c), \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u0444\u0430\u0439\u043b\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0442. \u0434., \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438, \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u0438\u043a\u0438 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438 \u0438 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u0430 \u043d\u0430 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>TestLintTask<\/code> \u0438 \u0432 \u043d\u0451\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 <code>Issue<\/code> \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0422\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432, \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0443 \u043d\u0430\u0441\u00a0\u2014 <code>allowMissingSdk()<\/code>. \u0414\u0430\u043b\u0435\u0435 \u0432 <code>lintTask<\/code> \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0441 \u043a\u043e\u0434\u043e\u043c \u0438\u043b\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0442\u0430\u0431\u044b \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <code>run()<\/code> \u0438 \u0432 <code>expect()<\/code> \u0438 <code>expectFixDiffs()<\/code> \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u043e\u0442\u0447\u0451\u0442 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0438\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e (\u043a\u0430\u043a \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430\u0445, \u0442\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432).<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u0442\u0430\u0431\u044b \u0438 LintTask.<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u043e\u0434\u0441\u0443\u043d\u0443\u043b\u0438 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438.<\/figcaption><\/div>\n<\/figure>\n<h2>AST \u0438 PSI<\/h2>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 <code>UastScanner<\/code>. \u0422\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 UAST \u0438 \u043a\u0430\u043a \u043e\u043d\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u044f\u0441\u044c \u0432 \u0434\u0435\u0442\u0430\u043b\u0438, \u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043a\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0430\u043f\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 (\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0435\u0442\u0430-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439). <\/p>\n<p>\u0422\u043e, \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0441\u0442\u0443\u0434\u0438\u0438, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 PSI (Programming Structure Interface). \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u043a\u043e\u0434\u0430. \u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451, \u0447\u0442\u043e \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435: \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0441\u043a\u043e\u0431\u043e\u0447\u043a\u0438 \u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b. \u0422\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e PSI \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (Kotlin \u0438 Java, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. \u0412 \u0441\u0442\u0443\u0434\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d PsiViewer, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c PSI \u043b\u044e\u0431\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (\u043f\u043e\u043b\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u043d\u0430\u043c \u044d\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u043e\u0437\u0436\u0435).<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043b\u0430\u0433\u0438\u043d PsiViewer.<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (AST). \u042d\u0442\u043e \u0442\u043e\u0436\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0434\u0435\u0440\u0435\u0432\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435, \u043d\u043e \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u0434\u043b\u044f \u043d\u0430\u0441. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c AST \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a PSI (\u043d\u0443 \u0438\u043b\u0438 \u043c\u044b \u043d\u0435 \u043d\u0430\u0448\u043b\u0438), \u0442\u0443\u0442 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0442\u0435\u0441\u0442\u044b, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c breakpoint \u043d\u0430 \u0443\u0437\u043b\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 AST \u0432 \u0436\u0443\u0440\u043d\u0430\u043b.<\/figcaption><\/div>\n<\/figure>\n<p>\u0418 \u0432\u043e\u0442 \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a Universal AST. UAST \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0435\u043a\u0443\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 AST \u0432 Kotlin \u0438 Java. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-378378","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/378378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=378378"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/378378\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=378378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=378378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=378378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}