diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java index 105d30a631ea..f3ba136b966e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java @@ -27,10 +27,13 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Set; import static com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer.ORG_JETBRAINS_ANNOTATIONS_CONTRACT; public class InferredAnnotationsManagerImpl extends InferredAnnotationsManager { + private static final Set INFERRED_ANNOTATIONS = + ContainerUtil.set(AnnotationUtil.NOT_NULL, AnnotationUtil.NULLABLE, ORG_JETBRAINS_ANNOTATIONS_CONTRACT); private final Project myProject; public InferredAnnotationsManagerImpl(Project project) { @@ -40,6 +43,10 @@ public class InferredAnnotationsManagerImpl extends InferredAnnotationsManager { @Nullable @Override public PsiAnnotation findInferredAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) { + if (!INFERRED_ANNOTATIONS.contains(annotationFQN)) { + return null; + } + listOwner = PsiUtil.preferCompiledElement(listOwner); if (ORG_JETBRAINS_ANNOTATIONS_CONTRACT.equals(annotationFQN) && listOwner instanceof PsiMethod) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index 549a149dff7e..81990047f9df 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -1015,6 +1015,9 @@ public class DfaMemoryStateImpl implements DfaMemoryState { public LongRangeSet getRange(DfaValue value) { if (value instanceof DfaVariableValue) { DfaVariableValue var = (DfaVariableValue)value; + if (!TypeConversionUtil.isPrimitiveAndNotNull(var.getVariableType())) { + return null; + } DfaVariableState state = getVariableState(var); LongRangeSet range = state.getRange(); if (range == null) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java index d5e2f1ce1e89..6a08a151497c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java @@ -439,7 +439,7 @@ class StateMerger { myVar = var; myPositive = positive; myArg = arg; - myHash = Objects.hash(myType, myVar, myPositive, myArg); + myHash = ((type.ordinal() * 31 + var.hashCode()) * 31 + arg.hashCode()) * 31 + (positive ? 1 : 0); } @Override diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java index 07fd45c97130..03e1f862e318 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java @@ -73,7 +73,6 @@ public class DfaExpressionFactory { return getExpressionDfaValue(((PsiParenthesizedExpression)expression).getExpression()); } - PsiType type = expression.getType(); if (expression instanceof PsiArrayAccessExpression) { PsiExpression arrayExpression = ((PsiArrayAccessExpression)expression).getArrayExpression(); DfaValue qualifier = getExpressionDfaValue(arrayExpression); @@ -83,6 +82,7 @@ public class DfaExpressionFactory { return myFactory.getVarFactory().createVariableValue(indexVar, expression.getType(), false, (DfaVariableValue)qualifier); } } + PsiType type = expression.getType(); if (type != null) { return myFactory.createTypeValue(type, DfaPsiUtil.getElementNullability(type, null)); } @@ -105,11 +105,11 @@ public class DfaExpressionFactory { } final Object value = JavaConstantExpressionEvaluator.computeConstantExpression(expression, false); - if (value != null && type != null) { - if (value instanceof String) { - return myFactory.createTypeValue(type, Nullness.NOT_NULL); // Non-null string literal. + if (value != null) { + PsiType type = expression.getType(); + if (type != null) { + return myFactory.getConstFactory().createFromValue(value, type, null); } - return myFactory.getConstFactory().createFromValue(value, type, null); } if (expression instanceof PsiThisExpression) { diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java b/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java index f7c3e6bb6bb6..4c21bc9aae15 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -182,12 +182,12 @@ public abstract class BaseExternalAnnotationsManager extends ExternalAnnotations @NotNull private List doCollect(@NotNull PsiModifierListOwner listOwner, boolean onlyWritable) { - String externalName = getExternalName(listOwner, false); - if (externalName == null) return NO_DATA; - List files = findExternalAnnotationsFiles(listOwner); if (files == null) return NO_DATA; + String externalName = getExternalName(listOwner, false); + if (externalName == null) return NO_DATA; + SmartList result = new SmartList<>(); for (PsiFile file : files) { if (!file.isValid()) continue;