package com.intellij.codeInspection.tests.java import com.intellij.codeInspection.tests.JavaApiUsageInspectionTestBase import com.intellij.jvm.analysis.JavaJvmAnalysisTestUtil import com.intellij.openapi.module.Module import com.intellij.openapi.roots.ContentEntry import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.pom.java.LanguageLevel import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.PsiTestUtil class JavaJavaApiUsageInspectionTest : JavaApiUsageInspectionTestBase() { override fun getBasePath(): String = JavaJvmAnalysisTestUtil.TEST_DATA_PROJECT_RELATIVE_BASE_PATH override fun getProjectDescriptor(): LightProjectDescriptor = object : ProjectDescriptor(languageLevel) { override fun configureModule(module: Module, model: ModifiableRootModel, contentEntry: ContentEntry) { super.configureModule(module, model, contentEntry) val dataDir = "$testDataPath/codeInspection/apiUsage" PsiTestUtil.newLibrary("JDKMock").classesRoot("$dataDir/classes").addTo(model) } } fun `test constructor`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_4) myFixture.testHighlighting(ULanguage.JAVA, """ class Constructor { void foo() { throw new IllegalArgumentException("", new RuntimeException()); } } """.trimIndent()) } fun `test ignored`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.addClass(""" package java.awt.geom; public class GeneralPath { public void moveTo(int x, int y) { } } """.trimIndent()) myFixture.testHighlighting(ULanguage.JAVA, """ import java.awt.geom.GeneralPath; class Ignored { void foo() { GeneralPath path = new GeneralPath(); path.moveTo(0,0); } } """.trimIndent()) } fun `test qualified reference`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.testHighlighting(ULanguage.JAVA, """ import java.nio.charset.StandardCharsets; import java.nio.charset.Charset; class Main { void foo() { Charset utf = StandardCharsets.UTF_8; } } """.trimIndent()) } fun `test annotation`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.testHighlighting(ULanguage.JAVA, """ class Annotation { @SafeVarargs public final void a(java.util.List... ls) {} } """.trimIndent()) } fun `test override annotation`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.testHighlighting(ULanguage.JAVA, """ import java.util.Map; abstract class OverrideAnnotation implements Map { @Override public String getOrDefault(Object key, String defaultValue) { return null; } } """.trimIndent()) } fun `test default methods`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.testHighlighting(ULanguage.JAVA, """ import java.util.Iterator; class DefaultMethods implements Iterator { @Override public boolean hasNext() { return false; } @Override public String next() { return null; } static class T implements Iterator { @Override public boolean hasNext() { return false; } @Override public String next() { return null; } @Override public void remove() {} } { Iterator it = new Iterator() { @Override public boolean hasNext(){ return false; } @Override public String next(){ return null; } }; } } """.trimIndent()) } fun `test raw inherit from newly generified`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.addClass(""" package javax.swing; public class AbstractListModel {} """.trimIndent()) myFixture.testHighlighting(ULanguage.JAVA, """ class RawInheritFromNewlyGenerified { private AbstractCCM myModel; } abstract class AbstractCCM extends javax.swing.AbstractListModel { } """.trimIndent()) } fun `test generified`() { myFixture.setLanguageLevel(LanguageLevel.JDK_1_6) myFixture.addClass(""" package javax.swing; public interface ListModel { } """.trimIndent()) myFixture.addClass(""" package javax.swing; public class AbstractListModel implements ListModel { } """.trimIndent()) myFixture.testHighlighting(ULanguage.JAVA, """ import javax.swing.AbstractListModel; abstract class AbstractCCM extends AbstractListModel { } """.trimIndent()) } fun `test language level 14 with JDK 15`() { myFixture.setLanguageLevel(LanguageLevel.JDK_14) myFixture.testHighlighting(ULanguage.JAVA, """ class Main { { g("%s".formatted(1), "".stripIndent(), "".translateEscapes()); } private void g(String formatted, String stripIndent, String translateEscapes) {} } """.trimIndent()) } fun `test language level 15 with JDK 16`() { myFixture.setLanguageLevel(LanguageLevel.JDK_15) myFixture.testHighlighting(ULanguage.JAVA, """ class Main { { String.class.isRecord(); Class.class.getRecordComponents(); } } """.trimIndent()) } fun `test language level 16 with JDK 17`() { myFixture.setLanguageLevel(LanguageLevel.JDK_16) myFixture.testHighlighting(ULanguage.JAVA, """ class Main { { String.class.isRecord(); String.class.isSealed(); } } """.trimIndent()) } }