import com.intellij.util.containers.ContainerUtil;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
+import static com.intellij.patterns.PsiJavaPatterns.psiElement;
+import static com.intellij.patterns.PsiJavaPatterns.psiMethod;
+
public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionTool {
// deprecated fields remain to minimize changes to users inspection profiles (which are often located in version control).
@Deprecated @SuppressWarnings({"WeakerAccess"}) public boolean REPORT_NULLABLE_METHOD_OVERRIDES_NOTNULL = true;
for (PsiExpression rhs : initializers) {
if (rhs instanceof PsiReferenceExpression) {
PsiElement target = ((PsiReferenceExpression)rhs).resolve();
- if (target instanceof PsiParameter && target.isPhysical()) {
+ if (isConstructorParameter(target) && target.isPhysical()) {
PsiParameter parameter = (PsiParameter)target;
if (REPORT_NOT_ANNOTATED_GETTER && !manager.hasNullability(parameter) && !TypeConversionUtil.isPrimitiveAndNotNull(parameter.getType())) {
final PsiIdentifier nameIdentifier = parameter.getNameIdentifier();
}
}
+ private static boolean isConstructorParameter(@Nullable PsiElement parameter) {
+ return parameter instanceof PsiParameter && psiElement(PsiParameterList.class).withParent(psiMethod().constructor(true)).accepts(parameter.getParent());
+ }
+
@NotNull
private static String getPresentableAnnoName(@NotNull PsiModifierListOwner owner) {
NullableNotNullManager manager = NullableNotNullManager.getInstance(owner.getProject());
--- /dev/null
+import org.jetbrains.annotations.*;
+
+class Test {
+ <warning descr="Not-null fields must be initialized">@NotNull</warning> Object member;
+ <warning descr="Not-null fields must be initialized">@NotNull</warning> Object member2;
+
+ public Test(Object p) {
+ I i = param -> {
+ member = param;
+ };
+ I i2 = new I() {
+ @Override
+ public void foo(Object param) {
+ member2 = param;
+ }
+ };
+ i.foo(p);
+ i2.foo(p);
+ }
+}
+
+interface I {
+ void foo(Object param);
+}
\ No newline at end of file
public void testNotNullCustomException() throws Exception{ doTest(); }
public void testNotNullFieldNotInitialized() throws Exception{ doTest(); }
+ public void testNotNullFieldInitializedInLambda() { doTest(); }
public void testNotNullFieldNotInitializedInOneConstructor() { doTest(); }
public void testNotNullFieldNotInitializedSetting() {
myInspection.REQUIRE_NOTNULL_FIELDS_INITIALIZED = false;