diff options
Diffstat (limited to 'java/java-analysis-impl/src/com/intellij')
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); |