Disclaimer: я не являюсь сотрудником JetBrains (а жаль), поэтому код может не являться оптимальным и служит только для примера. Кому не интересна вводная часть - можно сразу перейти к настройке проекта. У каждой крупной организации со временем формируется набор правил по оформлению кода, который, в лучшем случае, фиксируется в Code Style (зачем он нужен можно прочитать здесь). Но самое сложное не написать свод правил, а заставить всех им следовать. Поэтому в идеале все проверки должны быть автоматизированы. Для этого уже много что придумано, но самым удобным, как мне кажется, остаются средства проверки IDE. По результатам опроса наиболее популярной IDE для Java-разработчиков является IDEA от JetBrains. Практически любая редакция IDEA - это платформенная часть и набор плагинов к ней, т.е. поддержка практически любого языка добавляется отдельным плагином и, конечно, IDEA очень хорошо расширяема. Поэтому добавить новую инспекцию в нее - не проблема. Самая популярная коллекция (или точнее - почти коллекция) на собеседованиях - Map, самая популярная реализация - HashMap. И коронным вопросом является вопрос про equals и hashCode (почитать можно тут, тут, а лучше конечно в самой документации 1, 2).  Поэтому у нас в организации есть правило, что у класса, который используется как ключ для HashMap, эти методы должны быть переопределены (явно или неявно - например, с помощью Lombok). К сожалению, в IDEA это не добавили - вот issue. Но для простых случаев это не сложно сделать самим. Будем поддерживать только следующие выражения: new HashMap<>(); new HashSet<>(); .collect(Collectors.toSet()); .collect(Collectors.toMap()); Главные отправные точки: Документация по разработке плагинов Исходный код IDEA Так же можно посмотреть различные видео, например: habr, youtube канал JetBrains На данный момент самым удобным способом создания каркаса плагина является - шаблон. После клонирования выполняется несколько предустановленных pipeline и на выходе мы получаем хорошую заготовку с шагами, которые необходимо выполнить. Так же существует набор простых примеров, которые сильно помогают разобраться, как все должно работать. Писать код будем на Kotlin. Исходный код можно посмотреть здесь.  Плагин для IDEA должен содержать файл resources/META-INF/plugin.xml, в котором описывается какие действия и расширения он предоставляет. Допустимых точек расширения очень много - около 1000. Если посмотреть в примерах и в коде IDEA, то для реализации инспекции нам нужно реализовать localInspection (имплементацию класса LocalInspectionTool, для языка Java есть абстрактный класс AbstractBaseJavaLocalInspectionTool).  Для реализации проверки я воспользуюсь методом который реализует паттер Visitor. IDEA для кода строит дерево (PSI Tree, PSI - Program Structure Interface). Для того чтобы его увидеть можно воспользоваться PSI Viewer (Tools->View PSI Structure) Наш Visitor будет посещать все узлы этого дерева и, если определит, что что-то не так, зарегистрирует проблему. В классе JavaElementVisitor уже есть весь список узлов, которые можно анализировать. Вот схема как парсится и строится это дерево из документации: Мы работаем с PSI Tree, который является результатом этого процесса. Сначала рассмотрим простой случай: Узел дерева new HashMap<>() соответствует PsiNewExpression и поэтому в нашем Visitor нужно переопределить метод  visitNewExpression: А дальше нужно смотреть, какие методы есть у класса PsiNewExpression. Почти наверняка PSI-классы содержат все, что вам нужно. А если чего-то и нет, то стоит обратить внимание на утильные классы (например, PsiReferenceUtil, PsiTypesUtil). Сама IDEA содержит огромное число примеров кода. Первое, что нужно определить, что этот узел ссылается на классы HashMap или HashSet: JAVA_UTIL_HASH_MAP, JAVA_UTIL_HASH_SET - String-константы из com.intellij.psi.CommonClassNames. Он содержит список наиболее используемых Java-классов. Дальше нам нужно получить класс ключа. Спасибо IDEA, она для нас уже нашла это значение (даже для diamond-оператора - <>) Осталось проверить, что класс, на который ссылается PsiType, содержит переопределенный hashCode метод. Я нашел следующий путь (возможно есть более оптимальный): C equals поступаем аналогично. И если все плохо - осталось только зарегистрировать проблему: Теперь разберемся со Stream. Например, есть вот такой код: В этом случае мы работаем с PsiMethodCallExpression. Для первичной проверки можно воспользоваться CallMatcher (удобное средство для проверки совпадения методов): После этого можно проверить Collectors.toMap(): Получаем первый generic для этого выражения: А дальше пользуемся уже реализованными функциями проверки переопределения  equals и hashCode. Для тестирования можно воспользоваться классом LightJavaInspectionTestCase. Примеры можно посмотреть в исходном коде данного плагина или в исходном коде IDEA. Стоит обратить внимание, что для функционирования тестов, нужен приложенный набор стандартных библиотек - папки mockJDK в IDEA. И, наконец, сам результат Этот пример покрывает не все места создания HashMap (HashSet) в стандартной библиотеке, но его можно быстро расширить на ваши случаи. Краткий вывод IDEA очень гибкий и удобный инструмент для разработки, который можно быстро расширить требуемыми функциями Документация по разработке плагинов Исходный код IDEA Шаблон для плагинов Примеры простых плагинов Использованный в статье исходный код