summaryrefslogtreecommitdiff
path: root/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java')
-rw-r--r--java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspectionBase.java30
1 files changed, 30 insertions, 0 deletions
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;
+ }
+ }
+ }
};
}