void (@NotNull PsiReferenceExpression expression) { super.visitReferenceExpression(expression); if (expression.getQualifierExpression() != null) { return; } final PsiType type = expression.getType(); if (!(type instanceof PsiClassType classType)) { return; } final String className = classType.rawType().getCanonicalText(); boolean deepCheck = false; if (!nonThreadSafeClasses.contains(className)) { if (!TypeUtils.isExpressionTypeAssignableWith(expression, nonThreadSafeClasses)) { return; } deepCheck = true; } final PsiElement target = expression.resolve(); if (!(target instanceof PsiField field)) { return; } if (!field.hasModifierProperty(PsiModifier.STATIC)) { return; } final PsiModifierListOwner parent = PsiTreeUtil.getParentOfType(expression, PsiField.class, PsiMethod.class, PsiClassInitializer.class); if (parent == null) { return; } if (parent instanceof PsiMethod || parent instanceof PsiClassInitializer) { if (parent.hasModifierProperty(PsiModifier.SYNCHRONIZED)) { return; } final PsiSynchronizedStatement synchronizedStatement = PsiTreeUtil.getParentOfType(expression, PsiSynchronizedStatement.class); if (synchronizedStatement != null) { return; } } if (parent instanceof PsiField || parent instanceof PsiClassInitializer) { if (parent.hasModifierProperty(PsiModifier.STATIC)) { return; } } if (deepCheck) { final PsiExpression initializer = field.getInitializer(); if (initializer == null) { return; } final PsiType initializerType = initializer.getType(); if (!(initializerType instanceof PsiClassType classType2)) { return; } final String className2 = classType2.rawType().getCanonicalText(); if (!nonThreadSafeClasses.contains(className2)) { return; } registerError(expression, className2); } else { registerError(expression, className); } }