diff --git a/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java b/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java index f8642b600202..3f8b31b7c7ed 100644 --- a/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java +++ b/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java @@ -47,16 +47,22 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.util.ArrayUtil; import com.intellij.util.Consumer; import com.intellij.util.IncorrectOperationException; import com.jetbrains.python.PythonFileType; import com.jetbrains.python.PythonHelpersLocator; +import com.jetbrains.python.PythonLanguage; import com.jetbrains.python.codeInsight.imports.OptimizeImportsQuickFix; import com.jetbrains.python.formatter.PyCodeStyleSettings; import com.jetbrains.python.inspections.PyPep8Inspection; import com.jetbrains.python.inspections.quickfix.ReformatFix; import com.jetbrains.python.inspections.quickfix.RemoveTrailingBlankLinesFix; +import com.jetbrains.python.psi.PyClass; +import com.jetbrains.python.psi.PyFunction; +import com.jetbrains.python.psi.PyUtil; +import com.jetbrains.python.psi.impl.PyPsiUtils; import com.jetbrains.python.sdk.PreferredSdkComparator; import com.jetbrains.python.sdk.PySdkUtil; import com.jetbrains.python.sdk.PythonSdkType; @@ -76,6 +82,7 @@ import java.util.regex.Pattern; */ public class Pep8ExternalAnnotator extends ExternalAnnotator { private static final Logger LOG = Logger.getInstance(Pep8ExternalAnnotator.class); + private static final Pattern E303_LINE_COUNT_PATTERN = Pattern.compile(".*\\((\\d+)\\)$"); public static class Problem { private final int myLine; @@ -222,32 +229,41 @@ public class Pep8ExternalAnnotator extends ExternalAnnotator= document.getLineCount() ? document.getTextLength()-1 : document.getLineStartOffset(line) + column; + offset = line >= document.getLineCount() ? document.getTextLength() - 1 : document.getLineStartOffset(line) + column; } else { offset = StringUtil.lineColToOffset(text, line, column); } PsiElement problemElement = file.findElementAt(offset); - if (!(problemElement instanceof PsiWhiteSpace) && !(problem.myCode.startsWith("E3"))) { - final PsiElement elementAfter = file.findElementAt(offset + 1); - if (elementAfter instanceof PsiWhiteSpace) { - problemElement = elementAfter; + // E3xx - blank lines warnings + if (!(problemElement instanceof PsiWhiteSpace) && problem.myCode.startsWith("E3")) { + final PsiElement elementBefore = file.findElementAt(Math.max(0, offset - 1)); + if (elementBefore instanceof PsiWhiteSpace) { + problemElement = elementBefore; } } + // W292 no newline at end of file + if (problemElement == null && document != null && offset == document.getTextLength() && problem.myCode.equals("W292")) { + problemElement = file.findElementAt(Math.max(0, offset - 1)); + } + + if (ignoreDueToSettings(project, problem, problemElement)) { + continue; + } + if (problemElement != null) { TextRange problemRange = problemElement.getTextRange(); - if (crossesLineBoundary(document, text, problemRange)) { - int lineEndOffset; + if (!(problemElement instanceof PsiWhiteSpace) && crossesLineBoundary(document, text, problemRange)) { + final int lineEndOffset; if (document != null) { - lineEndOffset = line >= document.getLineCount() ? document.getTextLength()-1 : document.getLineEndOffset(line); + lineEndOffset = line >= document.getLineCount() ? document.getTextLength() - 1 : document.getLineEndOffset(line); } else { - lineEndOffset = StringUtil.lineColToOffset(text, line+1, 0) - 1; + lineEndOffset = StringUtil.lineColToOffset(text, line + 1, 0) - 1; } if (offset > lineEndOffset) { // PSI/document don't match, don't try to highlight random places @@ -296,15 +312,48 @@ public class Pep8ExternalAnnotator extends ExternalAnnotator