blob: a09562d709a5eded6edd8beb9bddc08bfd113451 [file] [log] [blame]
/*
* Copyright 2000-2013 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jetbrains.python.psi;
import com.intellij.openapi.util.Key;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
/**
* @author yole
*/
public enum LanguageLevel {
PYTHON24(24, false, true, false, false),
PYTHON25(25, false, true, false, false),
PYTHON26(26, true, true, false, false),
PYTHON27(27, true, true, true, false),
PYTHON30(30, true, false, false, true),
PYTHON31(31, true, false, true, true),
PYTHON32(32, true, false, true, true),
PYTHON33(33, true, false, true, true),
PYTHON34(34, true, false, true, true);
private static LanguageLevel DEFAULT2 = PYTHON27;
private static LanguageLevel DEFAULT3 = PYTHON33;
public static LanguageLevel FORCE_LANGUAGE_LEVEL = null;
public static LanguageLevel getDefault() {
return DEFAULT2;
}
private final int myVersion;
private final boolean myHasWithStatement;
private final boolean myHasPrintStatement;
private final boolean mySupportsSetLiterals;
private final boolean myIsPy3K;
LanguageLevel(int version, boolean hasWithStatement, boolean hasPrintStatement, boolean supportsSetLiterals, boolean isPy3K) {
myVersion = version;
myHasWithStatement = hasWithStatement;
myHasPrintStatement = hasPrintStatement;
mySupportsSetLiterals = supportsSetLiterals;
myIsPy3K = isPy3K;
}
/**
* @return an int where major and minor version are represented decimally: "version 2.5" is 25.
*/
public int getVersion() {
return myVersion;
}
public boolean hasWithStatement() {
return myHasWithStatement;
}
public boolean hasPrintStatement() {
return myHasPrintStatement;
}
public boolean supportsSetLiterals() {
return mySupportsSetLiterals;
}
public boolean isPy3K() {
return myIsPy3K;
}
public boolean isOlderThan(@NotNull LanguageLevel other) {
return myVersion < other.myVersion;
}
public boolean isAtLeast(@NotNull LanguageLevel other) {
return myVersion >= other.myVersion;
}
public static LanguageLevel fromPythonVersion(@NotNull String pythonVersion) {
if (pythonVersion.startsWith("2")) {
if (pythonVersion.startsWith("2.4")) {
return PYTHON24;
}
if (pythonVersion.startsWith("2.5")) {
return PYTHON25;
}
if (pythonVersion.startsWith("2.6")) {
return PYTHON26;
}
if (pythonVersion.startsWith("2.7")) {
return PYTHON27;
}
return DEFAULT2;
}
if (pythonVersion.startsWith("3")) {
if (pythonVersion.startsWith("3.0")) {
return PYTHON30;
}
if (pythonVersion.startsWith("3.1")) {
return PYTHON31;
}
if (pythonVersion.startsWith("3.2")) {
return PYTHON32;
}
if (pythonVersion.startsWith("3.3")) {
return PYTHON33;
}
if (pythonVersion.startsWith("3.4")) {
return PYTHON34;
}
return DEFAULT3;
}
return getDefault();
}
public static final Key<LanguageLevel> KEY = new Key<LanguageLevel>("python.language.level");
@NotNull
public static LanguageLevel forElement(@NotNull PsiElement element) {
final PsiFile containingFile = element.getContainingFile();
if (containingFile instanceof PyFile) {
return ((PyFile) containingFile).getLanguageLevel();
}
return getDefault();
}
@Override
public String toString() {
return myVersion / 10 + "." + myVersion % 10;
}
}