check compiler version (IDEA-163104)

compiler will be chosen as max(module compiler, project compiler)
This commit is contained in:
Anna.Kozlova
2018-11-06 10:47:58 +01:00
parent 4be054181c
commit df236e8c91
4 changed files with 15 additions and 3 deletions
@@ -669,8 +669,8 @@ public class GenericsHighlightUtil {
if (!checkEqualsSuper && MethodSignatureUtil.isSubsignature(superSignature, signatureToCheck)) {
return null;
}
if (!javaVersionService.isAtLeast(aClass, JavaSdkVersion.JDK_1_8)) {
//javac <= 1.7 didn't check transitive overriding rules for interfaces
if (!javaVersionService.isCompilerVersionAtLeast(aClass, JavaSdkVersion.JDK_1_7)) {
//javac <= 1.6 didn't check transitive overriding rules for interfaces
if (superContainingClass != null && !superContainingClass.isInterface() && checkContainingClass.isInterface() && !aClass.equals(superContainingClass)) return null;
}
if (aClass.equals(checkContainingClass)) {
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.projectRoots;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -33,4 +34,11 @@ public class JavaVersionServiceImpl extends JavaVersionService {
public JavaSdkVersion getJavaSdkVersion(@NotNull PsiElement element) {
return JavaSdkVersionUtil.getJavaSdkVersion(element);
}
@Override
public boolean isCompilerVersionAtLeast(@NotNull PsiElement element, @NotNull JavaSdkVersion version) {
if (super.isCompilerVersionAtLeast(element, version)) return true;
JavaSdkVersion projectVersion = JavaSdkVersionUtil.getJavaSdkVersion(ProjectRootManager.getInstance(element.getProject()).getProjectSdk());
return projectVersion != null && projectVersion.isAtLeast(version);
}
}
@@ -38,4 +38,8 @@ public class JavaVersionService {
public JavaSdkVersion getJavaSdkVersion(@NotNull PsiElement element) {
return JavaSdkVersion.fromLanguageLevel(PsiUtil.getLanguageLevel(element));
}
public boolean isCompilerVersionAtLeast(@NotNull PsiElement element, @NotNull JavaSdkVersion version) {
return isAtLeast(element, version);
}
}
@@ -6,7 +6,7 @@ interface I{
abstract class A {
abstract <T extends Iterable<String>> void foo();
<T extends A & I> void bar(T x){
<<error descr="'foo()' in 'pck.I' clashes with 'foo()' in 'pck.A'; both methods have same erasure, yet neither overrides the other"></error>T extends A & I> void bar(T x){
x.foo<error descr="Ambiguous method call: both 'A.foo()' and 'I.foo()' match">()</error>;
}
}