/** * Copyright (c) 2005-2012 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 Sep 17, 2006 * @author Fabio */ package org.python.pydev.core; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public interface IGrammarVersionProvider { /** * Constants for knowing the version of a grammar (so that jython 2.1 and python 2.1 can be regarded * as GRAMMAR_PYTHON_VERSION_2_1), so, in short, it does not differentiate among the many flavors of python * * They don't start at 0 because we don't want any accidents... ;-) */ public static final int GRAMMAR_PYTHON_VERSION_2_4 = 10; public static final int GRAMMAR_PYTHON_VERSION_2_5 = 11; public static final int GRAMMAR_PYTHON_VERSION_2_6 = 12; public static final int GRAMMAR_PYTHON_VERSION_2_7 = 13; public static final int LATEST_GRAMMAR_VERSION = GRAMMAR_PYTHON_VERSION_2_7; /** * Just in case you're wondering, Version 3.0 is not the latest... it's as if it's a new grammar entirely. */ public static final int GRAMMAR_PYTHON_VERSION_3_0 = 99; public static final int GRAMMAR_PYTHON_VERSION_3_6 = 100; public static final int LATEST_GRAMMAR_PY3_VERSION = GRAMMAR_PYTHON_VERSION_3_6; /** * So, no specific reason for the 777 number (just wanted something unique that wouldn't be close to the other grammars). */ public static final int GRAMMAR_PYTHON_VERSION_CYTHON = 777; /** * @return the version of the grammar as defined in IPythonNature.GRAMMAR_PYTHON_VERSION... * @throws MisconfigurationException */ public int getGrammarVersion() throws MisconfigurationException; /** * @return may be null * @throws MisconfigurationException */ public AdditionalGrammarVersionsToCheck getAdditionalGrammarVersions() throws MisconfigurationException; public static List<Integer> grammarVersions = GrammarsIterator.createList(); public static Map<Integer, String> grammarVersionToRep = GrammarsIterator.createDict(); public static Map<String, Integer> grammarRepToVersion = GrammarsIterator.createStrToInt(); public static List<String> grammarVersionsRep = GrammarsIterator.createStr(); public static class AdditionalGrammarVersionsToCheck { private final Set<Integer> grammarVersionsToCheck = new HashSet<>(); public void add(int grammarVersion) { this.grammarVersionsToCheck.add(grammarVersion); } public Set<Integer> getGrammarVersions() { return grammarVersionsToCheck; } } } /** * Just create a new class to initialize those values (we cannot do it in the interface) */ class GrammarsIterator { public static List<Integer> createList() { List<Integer> grammarVersions = new ArrayList<>(); grammarVersions.add(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_4); grammarVersions.add(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_5); grammarVersions.add(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_6); grammarVersions.add(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_7); grammarVersions.add(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_3_0); grammarVersions.add(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_3_6); return Collections.unmodifiableList(grammarVersions); } public static List<String> createStr() { List<String> grammarVersions = new ArrayList<>(); grammarVersions.add("2.4"); grammarVersions.add("2.5"); grammarVersions.add("2.6"); grammarVersions.add("2.7"); grammarVersions.add("3.0"); grammarVersions.add("3.6"); return Collections.unmodifiableList(grammarVersions); } public static Map<Integer, String> createDict() { HashMap<Integer, String> ret = new HashMap<>(); ret.put(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_4, "2.4"); ret.put(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_5, "2.5"); ret.put(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_6, "2.6"); ret.put(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_7, "2.7"); ret.put(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_3_0, "3.0"); ret.put(IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_3_6, "3.6"); return Collections.unmodifiableMap(ret); } public static Map<String, Integer> createStrToInt() { HashMap<String, Integer> ret = new HashMap<>(); ret.put("2.4", IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_4); ret.put("2.5", IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_5); ret.put("2.6", IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_6); ret.put("2.7", IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_7); ret.put("3.0", IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_3_0); ret.put("3.6", IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_3_6); return Collections.unmodifiableMap(ret); } }