/** * 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 24/07/2005 */ package com.python.pydev.analysis; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.Preferences; public class AnalysisPreferences extends AbstractAnalysisPreferences { /** * singleton */ private static IAnalysisPreferences analysisPreferences; /** * lock */ public static final Object lock = new Object(); /** * @return get the preferences for analysis based on the preferences */ public static IAnalysisPreferences getAnalysisPreferences() { if (analysisPreferences == null) { analysisPreferences = new AnalysisPreferences(); } return analysisPreferences; } /** * when adding a new type, it must be specified: * here * AnalysisPreferenceInitializer * IAnalysisPreferences * AnalysisPreferencesPage */ final static Object[][] completeSeverityMap = new Object[][] { { IAnalysisPreferences.TYPE_UNUSED_IMPORT, AnalysisPreferenceInitializer.SEVERITY_UNUSED_IMPORT, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_UNUSED_IMPORT }, { IAnalysisPreferences.TYPE_UNUSED_VARIABLE, AnalysisPreferenceInitializer.SEVERITY_UNUSED_VARIABLE, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_UNUSED_VARIABLE }, { IAnalysisPreferences.TYPE_UNDEFINED_VARIABLE, AnalysisPreferenceInitializer.SEVERITY_UNDEFINED_VARIABLE, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_UNDEFINED_VARIABLE }, { IAnalysisPreferences.TYPE_DUPLICATED_SIGNATURE, AnalysisPreferenceInitializer.SEVERITY_DUPLICATED_SIGNATURE, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_DUPLICATED_SIGNATURE }, { IAnalysisPreferences.TYPE_REIMPORT, AnalysisPreferenceInitializer.SEVERITY_REIMPORT, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_REIMPORT }, { IAnalysisPreferences.TYPE_UNRESOLVED_IMPORT, AnalysisPreferenceInitializer.SEVERITY_UNRESOLVED_IMPORT, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_UNRESOLVED_IMPORT }, { IAnalysisPreferences.TYPE_NO_SELF, AnalysisPreferenceInitializer.SEVERITY_NO_SELF, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_NO_SELF }, { IAnalysisPreferences.TYPE_UNUSED_WILD_IMPORT, AnalysisPreferenceInitializer.SEVERITY_UNUSED_WILD_IMPORT, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_UNUSED_WILD_IMPORT }, { IAnalysisPreferences.TYPE_UNDEFINED_IMPORT_VARIABLE, AnalysisPreferenceInitializer.SEVERITY_UNDEFINED_IMPORT_VARIABLE, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_UNDEFINED_IMPORT_VARIABLE }, { IAnalysisPreferences.TYPE_UNUSED_PARAMETER, AnalysisPreferenceInitializer.SEVERITY_UNUSED_PARAMETER, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_UNUSED_PARAMETER }, { IAnalysisPreferences.TYPE_NO_EFFECT_STMT, AnalysisPreferenceInitializer.SEVERITY_NO_EFFECT_STMT, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_NO_EFFECT_STMT }, { IAnalysisPreferences.TYPE_INDENTATION_PROBLEM, AnalysisPreferenceInitializer.SEVERITY_INDENTATION_PROBLEM, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_INDENTATION_PROBLEM }, { IAnalysisPreferences.TYPE_ASSIGNMENT_TO_BUILT_IN_SYMBOL, AnalysisPreferenceInitializer.SEVERITY_ASSIGNMENT_TO_BUILT_IN_SYMBOL, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_ASSIGNMENT_TO_BUILT_IN_SYMBOL }, { IAnalysisPreferences.TYPE_PEP8, AnalysisPreferenceInitializer.SEVERITY_PEP8, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_PEP8 }, { IAnalysisPreferences.TYPE_ARGUMENTS_MISATCH, AnalysisPreferenceInitializer.SEVERITY_ARGUMENTS_MISMATCH, AnalysisPreferenceInitializer.DEFAULT_SEVERITY_ARGUMENTS_MISMATCH }, }; public void clearCaches() { synchronized (lock) { severityTypeMapCache = null; } } HashMap<Integer, Integer> severityTypeMapCache = null; private Map<Integer, Integer> getSeverityTypeMap() { synchronized (lock) { if (severityTypeMapCache == null) { severityTypeMapCache = new HashMap<Integer, Integer>(); Preferences pluginPreferences = AnalysisPlugin.getDefault().getPluginPreferences(); for (int i = 0; i < completeSeverityMap.length; i++) { Object[] s = completeSeverityMap[i]; severityTypeMapCache.put((Integer) s[0], pluginPreferences.getInt((String) s[1])); } //TODO: Add ARGUMENTS_MISMATCH again later on severityTypeMapCache.put(IAnalysisPreferences.TYPE_ARGUMENTS_MISATCH, IMarker.SEVERITY_INFO); //Force it to be disabled for now! } return severityTypeMapCache; } } /** * return the severity based on the user-set values * * @see com.python.pydev.analysis.IAnalysisPreferences#getSeverityForType(int) */ public int getSeverityForType(int type) { synchronized (lock) { Map<Integer, Integer> severityTypeMap = getSeverityTypeMap(); Integer sev = severityTypeMap.get(type); if (sev == null) { throw new RuntimeException("Unable to get severity for: " + type); } return sev; } } /** * yeah, we always do code analysis... * * @see com.python.pydev.analysis.IAnalysisPreferences#makeCodeAnalysis() */ public boolean makeCodeAnalysis() { synchronized (lock) { AnalysisPlugin plugin = AnalysisPlugin.getDefault(); if (plugin == null) { return false;//in shutdown } Preferences pluginPreferences = plugin.getPluginPreferences(); return pluginPreferences.getBoolean(AnalysisPreferenceInitializer.DO_CODE_ANALYSIS); } } /** * @see com.python.pydev.analysis.IAnalysisPreferences#getNamesIgnoredByUnusedVariable() */ public Set<String> getNamesIgnoredByUnusedVariable() { return getSetOfNames(AnalysisPreferenceInitializer.NAMES_TO_IGNORE_UNUSED_VARIABLE); } public Set<String> getTokensAlwaysInGlobals() { return getSetOfNames(AnalysisPreferenceInitializer.NAMES_TO_CONSIDER_GLOBALS); } /** * @param preferencesName * @return */ private Set<String> getSetOfNames(String preferencesName) { HashSet<String> names = new HashSet<String>(); Preferences pluginPreferences = AnalysisPlugin.getDefault().getPluginPreferences(); String string = pluginPreferences.getString(preferencesName); if (string != null) { String[] strings = string.split(","); for (int i = 0; i < strings.length; i++) { names.add(strings[i].trim()); } } return names; } /** * @see com.python.pydev.analysis.IAnalysisPreferences#getModuleNamePatternsToBeIgnored() */ public Set<String> getModuleNamePatternsToBeIgnored() { Set<String> setOfNames = getSetOfNames(AnalysisPreferenceInitializer.NAMES_TO_IGNORE_UNUSED_IMPORT); HashSet<String> ret = new HashSet<String>(); for (String string : setOfNames) { //we have to make it a regular expression as java requires, so * is actually .* ret.add(string.replaceAll("\\*", ".*")); } return ret; } /** * @see com.python.pydev.analysis.IAnalysisPreferences#getWhenAnalyze() */ public int getWhenAnalyze() { Preferences pluginPreferences = AnalysisPlugin.getDefault().getPluginPreferences(); return pluginPreferences.getInt(AnalysisPreferenceInitializer.WHEN_ANALYZE); } }