diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java b/java/java-analysis-impl/src/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java index ddc01ee12836..6f1f69b01aa3 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -94,7 +94,7 @@ public class LocalCanBeFinal extends BaseJavaBatchLocalInspectionTool { try { ControlFlowPolicy policy = new ControlFlowPolicy() { @Override - public PsiVariable getUsedVariable(PsiReferenceExpression refExpr) { + public PsiVariable getUsedVariable(@NotNull PsiReferenceExpression refExpr) { if (refExpr.isQualified()) return null; PsiElement refElement = refExpr.resolve(); @@ -107,12 +107,12 @@ public class LocalCanBeFinal extends BaseJavaBatchLocalInspectionTool { } @Override - public boolean isParameterAccepted(PsiParameter psiParameter) { + public boolean isParameterAccepted(@NotNull PsiParameter psiParameter) { return isVariableDeclaredInMethod(psiParameter); } @Override - public boolean isLocalVariableAccepted(PsiLocalVariable psiVariable) { + public boolean isLocalVariableAccepted(@NotNull PsiLocalVariable psiVariable) { return isVariableDeclaredInMethod(psiVariable); } diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/AllVariablesControlFlowPolicy.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/AllVariablesControlFlowPolicy.java index 944e9c6e5285..5f90c5ba1643 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/AllVariablesControlFlowPolicy.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/AllVariablesControlFlowPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -25,23 +25,24 @@ package com.intellij.psi.controlFlow; import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; public class AllVariablesControlFlowPolicy implements ControlFlowPolicy { private static final AllVariablesControlFlowPolicy INSTANCE = new AllVariablesControlFlowPolicy(); @Override - public PsiVariable getUsedVariable(PsiReferenceExpression refExpr) { + public PsiVariable getUsedVariable(@NotNull PsiReferenceExpression refExpr) { PsiElement resolved = refExpr.resolve(); return resolved instanceof PsiVariable ? (PsiVariable)resolved : null; } @Override - public boolean isParameterAccepted(PsiParameter psiParameter) { + public boolean isParameterAccepted(@NotNull PsiParameter psiParameter) { return true; } @Override - public boolean isLocalVariableAccepted(PsiLocalVariable psiVariable) { + public boolean isLocalVariableAccepted(@NotNull PsiLocalVariable psiVariable) { return true; } diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowPolicy.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowPolicy.java index c33927a8eefb..98948eb99998 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowPolicy.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -19,13 +19,14 @@ import com.intellij.psi.PsiLocalVariable; import com.intellij.psi.PsiParameter; import com.intellij.psi.PsiReferenceExpression; import com.intellij.psi.PsiVariable; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public interface ControlFlowPolicy { @Nullable - PsiVariable getUsedVariable(PsiReferenceExpression refExpr); + PsiVariable getUsedVariable(@NotNull PsiReferenceExpression refExpr); - boolean isParameterAccepted(PsiParameter psiParameter); + boolean isParameterAccepted(@NotNull PsiParameter psiParameter); - boolean isLocalVariableAccepted(PsiLocalVariable psiVariable); + boolean isLocalVariableAccepted(@NotNull PsiLocalVariable psiVariable); } diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java index 0e6ed1625d67..fe7274ed08a2 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowUtil.java @@ -378,7 +378,8 @@ public class ControlFlowUtil { return PsiTreeUtil.getParentOfType(element, PsiStatement.class, false); } - public static PsiElement findCodeFragment(PsiElement element) { + @NotNull + public static PsiElement findCodeFragment(@NotNull PsiElement element) { PsiElement codeFragment = element; PsiElement parent = codeFragment.getParent(); while (parent != null) { diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/DefUseUtil.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/DefUseUtil.java index cfe36203de6c..8cddc9ef8d1d 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/DefUseUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/DefUseUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -462,7 +462,7 @@ public class DefUseUtil { private static final ControlFlowPolicy ourPolicy = new ControlFlowPolicy() { @Override - public PsiVariable getUsedVariable(PsiReferenceExpression refExpr) { + public PsiVariable getUsedVariable(@NotNull PsiReferenceExpression refExpr) { if (refExpr.isQualified()) return null; PsiElement refElement = refExpr.resolve(); @@ -474,12 +474,12 @@ public class DefUseUtil { } @Override - public boolean isParameterAccepted(PsiParameter psiParameter) { + public boolean isParameterAccepted(@NotNull PsiParameter psiParameter) { return true; } @Override - public boolean isLocalVariableAccepted(PsiLocalVariable psiVariable) { + public boolean isLocalVariableAccepted(@NotNull PsiLocalVariable psiVariable) { return true; } }; diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/LocalsControlFlowPolicy.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/LocalsControlFlowPolicy.java index b5c0f8ef40a9..5418b8679bd7 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/LocalsControlFlowPolicy.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/LocalsControlFlowPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -16,17 +16,18 @@ package com.intellij.psi.controlFlow; import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class LocalsControlFlowPolicy implements ControlFlowPolicy { private final PsiElement myCodeFragment; - public LocalsControlFlowPolicy(PsiElement codeFragment) { + public LocalsControlFlowPolicy(@NotNull PsiElement codeFragment) { myCodeFragment = codeFragment; } @Override - public PsiVariable getUsedVariable(PsiReferenceExpression refExpr) { + public PsiVariable getUsedVariable(@NotNull PsiReferenceExpression refExpr) { if (refExpr.isQualified()) return null; PsiElement refElement = refExpr.resolve(); @@ -34,8 +35,8 @@ public class LocalsControlFlowPolicy implements ControlFlowPolicy { } @Nullable - private PsiVariable checkCodeFragment(PsiElement refElement) { - PsiElement codeFragment = ControlFlowUtil.findCodeFragment(refElement); + private PsiVariable checkCodeFragment(@NotNull PsiElement refElement) { + PsiElement codeFragment; if (refElement instanceof PsiParameter) { final PsiElement declarationScope = ((PsiParameter)refElement).getDeclarationScope(); if (declarationScope instanceof PsiMethod) { @@ -44,6 +45,12 @@ public class LocalsControlFlowPolicy implements ControlFlowPolicy { else if (declarationScope instanceof PsiLambdaExpression) { codeFragment = ((PsiLambdaExpression)declarationScope).getBody(); } + else { + codeFragment = ControlFlowUtil.findCodeFragment(refElement); + } + } + else { + codeFragment = ControlFlowUtil.findCodeFragment(refElement); } if (codeFragment == null) return null; if (myCodeFragment.getContainingFile() == codeFragment.getContainingFile() && // in order for jsp includes to work @@ -54,12 +61,27 @@ public class LocalsControlFlowPolicy implements ControlFlowPolicy { } @Override - public boolean isParameterAccepted(PsiParameter psiParameter) { + public boolean isParameterAccepted(@NotNull PsiParameter psiParameter) { return checkCodeFragment(psiParameter) != null; } @Override - public boolean isLocalVariableAccepted(PsiLocalVariable psiVariable) { + public boolean isLocalVariableAccepted(@NotNull PsiLocalVariable psiVariable) { return checkCodeFragment(psiVariable) != null; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + LocalsControlFlowPolicy policy = (LocalsControlFlowPolicy)o; + + return myCodeFragment.equals(policy.myCodeFragment); + } + + @Override + public int hashCode() { + return myCodeFragment.hashCode(); + } } diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/LocalsOrMyInstanceFieldsControlFlowPolicy.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/LocalsOrMyInstanceFieldsControlFlowPolicy.java index e544aaee4908..e71d13c91f1f 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/LocalsOrMyInstanceFieldsControlFlowPolicy.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/LocalsOrMyInstanceFieldsControlFlowPolicy.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -25,6 +25,7 @@ package com.intellij.psi.controlFlow; import com.intellij.psi.*; +import org.jetbrains.annotations.NotNull; public class LocalsOrMyInstanceFieldsControlFlowPolicy implements ControlFlowPolicy { private static final LocalsOrMyInstanceFieldsControlFlowPolicy INSTANCE = new LocalsOrMyInstanceFieldsControlFlowPolicy(); @@ -33,7 +34,7 @@ public class LocalsOrMyInstanceFieldsControlFlowPolicy implements ControlFlowPol } @Override - public PsiVariable getUsedVariable(PsiReferenceExpression refExpr) { + public PsiVariable getUsedVariable(@NotNull PsiReferenceExpression refExpr) { PsiExpression qualifier = refExpr.getQualifierExpression(); if (qualifier == null || qualifier instanceof PsiThisExpression) { PsiElement resolved = refExpr.resolve(); @@ -45,12 +46,12 @@ public class LocalsOrMyInstanceFieldsControlFlowPolicy implements ControlFlowPol } @Override - public boolean isParameterAccepted(PsiParameter psiParameter) { + public boolean isParameterAccepted(@NotNull PsiParameter psiParameter) { return true; } @Override - public boolean isLocalVariableAccepted(PsiLocalVariable psiVariable) { + public boolean isLocalVariableAccepted(@NotNull PsiLocalVariable psiVariable) { return true; }