/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Created on 18/09/2005 */ package com.python.pydev.analysis.builder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.text.IDocument; import org.python.pydev.builder.PydevMarkerUtils; import org.python.pydev.builder.PydevMarkerUtils.MarkerInfo; import org.python.pydev.core.docutils.PySelection; import org.python.pydev.core.log.Log; import com.python.pydev.analysis.messages.IMessage; public class AnalysisRunner { public static final String PYDEV_CODE_ANALYSIS_IGNORE = "@PydevCodeAnalysisIgnore"; /** * Indicates the type of the message given the constants in com.python.pydev.analysis.IAnalysisPreferences (unused import, * undefined variable...) */ public static final String PYDEV_ANALYSIS_TYPE = "PYDEV_TYPE"; /** * Indicates the additional info for the marker (depends on its type) - may be null */ public static final String PYDEV_ANALYSIS_ADDITIONAL_INFO = "PYDEV_INFO"; /** * this is the type of the marker */ public static final String PYDEV_ANALYSIS_PROBLEM_MARKER = "com.python.pydev.analysis.pydev_analysis_problemmarker"; /** * do we want to debug this class? */ private static final boolean DEBUG_ANALYSIS_RUNNER = false; /** * @param document the document we want to check * @return true if we can analyze it and false if there is some flag saying that we shouldn't */ public boolean canDoAnalysis(IDocument document) { if (document == null) { return false; } for (int i = 0; i < 3; i++) { //Only check first 3 lines. String line = PySelection.getLine(document, i); int commentIndex; if ((commentIndex = line.indexOf('#')) != -1) { if (line.substring(commentIndex).contains(PYDEV_CODE_ANALYSIS_IGNORE)) { return false; } } } return true; } /** * @param resource the resource that should have the markers deleted */ public static void deleteMarkers(IResource resource) { if (resource == null) { return; } try { resource.deleteMarkers(PYDEV_ANALYSIS_PROBLEM_MARKER, true, IResource.DEPTH_ZERO); } catch (CoreException e) { //ok, if it is a resource exception, it may have happened because the resource does not exist anymore //so, there is no need to log this failure if (resource.exists()) { Log.log(e); } } catch (Exception e) { Log.log(e); } } /** * Sets the analysis markers in the resource (removes current markers and adds the new ones) * * @param resource the resource where we want to add the markers * @param document the document * @param messages the messages to add * @param monitor monitor to check if we should stop the process. * @param existing these are the existing markers. After this method, the list will contain only the ones that * should be removed. */ public void setMarkers(IResource resource, IDocument document, IMessage[] messages, IProgressMonitor monitor) { if (resource == null) { return; } try { //Timer timer = new Timer(); //System.out.println("Start creating markers"); ArrayList<MarkerInfo> lst = new ArrayList<MarkerInfo>(); //add the markers... the id is put as additional info for it for (IMessage m : messages) { HashMap<String, Object> additionalInfo = new HashMap<String, Object>(); additionalInfo.put(PYDEV_ANALYSIS_TYPE, m.getType()); //not all messages have additional info List<String> infoForType = m.getAdditionalInfo(); if (infoForType != null) { additionalInfo.put(PYDEV_ANALYSIS_ADDITIONAL_INFO, infoForType); } int startLine = m.getStartLine(document) - 1; int startCol = m.getStartCol(document) - 1; int endLine = m.getEndLine(document) - 1; int endCol = m.getEndCol(document) - 1; String msg = m.getMessage(); if (DEBUG_ANALYSIS_RUNNER) { System.out.printf("\nAdding at start:%s end:%s line:%s message:%s ", startCol, endCol, startLine, msg); } if (monitor.isCanceled()) { return; } MarkerInfo markerInfo = new PydevMarkerUtils.MarkerInfo(document, msg, AnalysisRunner.PYDEV_ANALYSIS_PROBLEM_MARKER, m.getSeverity(), false, false, startLine, startCol, endLine, endCol, additionalInfo); lst.add(markerInfo); } if (monitor.isCanceled()) { return; } PydevMarkerUtils.replaceMarkers(lst, resource, AnalysisRunner.PYDEV_ANALYSIS_PROBLEM_MARKER, true, monitor); //timer.printDiff("Time to put markers: "+lst.size()); } catch (Exception e) { Log.log("Error when setting markers on: " + resource, e); } } }