summaryrefslogtreecommitdiff
path: root/java/java-analysis-impl/src/com/intellij
diff options
context:
space:
mode:
Diffstat (limited to 'java/java-analysis-impl/src/com/intellij')
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java4
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java30
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/unnecessaryModuleDependency/UnnecessaryModuleDependencyInspection.java1
3 files changed, 33 insertions, 2 deletions
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
index d927d8cb78a4..bf0fc63be2a2 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
@@ -1485,7 +1485,7 @@ class ControlFlowAnalyzer extends JavaElementVisitor {
return Collections.emptyList();
}
- private static List<MethodContract> parseContract(String text) throws ParseException {
+ public static List<MethodContract> parseContract(String text) throws ParseException {
List<MethodContract> result = ContainerUtil.newArrayList();
for (String clause : StringUtil.replace(text, " ", "").split(";")) {
String arrow = "->";
@@ -1516,7 +1516,7 @@ class ControlFlowAnalyzer extends JavaElementVisitor {
throw new ParseException("Constraint should be one of: null, !null, true, false, exit, fail, _. Found: " + name);
}
- private static class ParseException extends Exception {
+ public static class ParseException extends Exception {
private ParseException(String message) {
super(message);
}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java
index fc58969f5122..7edeb3ac30b7 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java
@@ -48,6 +48,7 @@ import com.intellij.util.ArrayUtilRt;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.SmartList;
import org.jdom.Element;
+import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -98,6 +99,35 @@ public class DataFlowInspectionBase extends BaseJavaBatchLocalInspectionTool {
public void visitClassInitializer(PsiClassInitializer initializer) {
analyzeCodeBlock(initializer.getBody(), holder);
}
+
+ @Override
+ public void visitAnnotation(PsiAnnotation annotation) {
+ if (!Contract.class.getName().equals(annotation.getQualifiedName())) return;
+
+ PsiMethod method = PsiTreeUtil.getParentOfType(annotation, PsiMethod.class);
+ if (method == null) return;
+
+ PsiAnnotationMemberValue value = annotation.findAttributeValue(null);
+ Object text = JavaPsiFacade.getInstance(annotation.getProject()).getConstantEvaluationHelper().computeConstantExpression(value);
+ if (!(text instanceof String)) return;
+
+ List<MethodContract> contracts;
+ try {
+ contracts = ControlFlowAnalyzer.parseContract((String)text);
+ }
+ catch (ControlFlowAnalyzer.ParseException e) {
+ holder.registerProblem(value, e.getMessage());
+ return;
+ }
+ int paramCount = method.getParameterList().getParametersCount();
+ for (int i = 0; i < contracts.size(); i++) {
+ MethodContract contract = contracts.get(i);
+ if (contract.arguments.length != paramCount) {
+ holder.registerProblem(value, "Method takes " + paramCount + " parameters, while contract clause " + i + " expects " + contract.arguments.length);
+ return;
+ }
+ }
+ }
};
}
diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/unnecessaryModuleDependency/UnnecessaryModuleDependencyInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/unnecessaryModuleDependency/UnnecessaryModuleDependencyInspection.java
index 87e99c553b36..d552212d0243 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/unnecessaryModuleDependency/UnnecessaryModuleDependencyInspection.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/unnecessaryModuleDependency/UnnecessaryModuleDependencyInspection.java
@@ -37,6 +37,7 @@ public class UnnecessaryModuleDependencyInspection extends GlobalInspectionTool
if (refEntity instanceof RefModule){
final RefModule refModule = (RefModule)refEntity;
final Module module = refModule.getModule();
+ if (module.isDisposed()) return CommonProblemDescriptor.EMPTY_ARRAY;
final Module[] declaredDependencies = ModuleRootManager.getInstance(module).getDependencies();
List<CommonProblemDescriptor> descriptors = new ArrayList<CommonProblemDescriptor>();
final Set<Module> modules = refModule.getUserData(UnnecessaryModuleDependencyAnnotator.DEPENDENCIES);