diff --git a/cli/src/main/java/net/neoforged/jst/cli/intellij/IntelliJEnvironmentImpl.java b/cli/src/main/java/net/neoforged/jst/cli/intellij/IntelliJEnvironmentImpl.java index 07742fb..fc218dc 100644 --- a/cli/src/main/java/net/neoforged/jst/cli/intellij/IntelliJEnvironmentImpl.java +++ b/cli/src/main/java/net/neoforged/jst/cli/intellij/IntelliJEnvironmentImpl.java @@ -1,5 +1,6 @@ package net.neoforged.jst.cli.intellij; +import com.intellij.codeInsight.ExternalAnnotationsManager; import com.intellij.core.CoreApplicationEnvironment; import com.intellij.core.JavaCoreApplicationEnvironment; import com.intellij.core.JavaCoreProjectEnvironment; @@ -22,11 +23,16 @@ import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.JavaModuleSystem; import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementFinder; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.PsiManager; +import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.PsiNameHelper; +import com.intellij.psi.PsiNameValuePair; import com.intellij.psi.augment.PsiAugmentProvider; import com.intellij.psi.impl.JavaClassSupersImpl; import com.intellij.psi.impl.PsiElementFinderImpl; @@ -37,12 +43,15 @@ import com.intellij.psi.util.JavaClassSupers; import net.neoforged.jst.api.IntelliJEnvironment; import net.neoforged.jst.api.Logger; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import java.util.Objects; public class IntelliJEnvironmentImpl implements IntelliJEnvironment, AutoCloseable { @@ -153,6 +162,7 @@ public PsiFile parseFileFromMemory(String filename, String fileContent) { */ private void initProjectExtensionsAndServices(MockProject project) { project.registerService(PsiNameHelper.class, PsiNameHelperImpl.class); + project.registerService(ExternalAnnotationsManager.class, new MockExternalAnnotationsManager()); var projectExtensions = project.getExtensionArea(); CoreApplicationEnvironment.registerExtensionPoint(projectExtensions, PsiTreeChangePreprocessor.EP.getName(), PsiTreeChangePreprocessor.class); diff --git a/cli/src/main/java/net/neoforged/jst/cli/intellij/MockExternalAnnotationsManager.java b/cli/src/main/java/net/neoforged/jst/cli/intellij/MockExternalAnnotationsManager.java new file mode 100644 index 0000000..f3a4565 --- /dev/null +++ b/cli/src/main/java/net/neoforged/jst/cli/intellij/MockExternalAnnotationsManager.java @@ -0,0 +1,91 @@ +package net.neoforged.jst.cli.intellij; + +import com.intellij.codeInsight.ExternalAnnotationsManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiModifierListOwner; +import com.intellij.psi.PsiNameValuePair; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class MockExternalAnnotationsManager extends ExternalAnnotationsManager { + @Override + public boolean hasAnnotationRootsForFile(@NotNull VirtualFile file) { + return false; + } + + @Override + public boolean isExternalAnnotation(@NotNull PsiAnnotation annotation) { + return false; + } + + @Override + public @Nullable PsiAnnotation findExternalAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) { + return null; + } + + @Override + public @NotNull List findExternalAnnotations(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) { + return List.of(); + } + + @Override + public boolean isExternalAnnotationWritable(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) { + return false; + } + + @Override + public @NotNull PsiAnnotation @NotNull [] findExternalAnnotations(@NotNull PsiModifierListOwner listOwner) { + return new PsiAnnotation[0]; + } + + @Override + public @Nullable List findDefaultConstructorExternalAnnotations(@NotNull PsiClass aClass) { + return List.of(); + } + + @Override + public @Nullable List findDefaultConstructorExternalAnnotations(@NotNull PsiClass aClass, @NotNull String annotationFQN) { + return List.of(); + } + + @Override + public void annotateExternally(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQName, @NotNull PsiFile fromFile, PsiNameValuePair @Nullable [] value) throws CanceledConfigurationException { + + } + + @Override + public boolean deannotate(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN) { + return false; + } + + @Override + public boolean editExternalAnnotation(@NotNull PsiModifierListOwner listOwner, @NotNull String annotationFQN, PsiNameValuePair @Nullable [] value) { + return false; + } + + @Override + public @NotNull AnnotationPlace chooseAnnotationsPlaceNoUi(@NotNull PsiElement element) { + return AnnotationPlace.NOWHERE; + } + + @Override + public @NotNull AnnotationPlace chooseAnnotationsPlace(@NotNull PsiElement element) { + return AnnotationPlace.NOWHERE; + } + + @Override + public @Nullable List findExternalAnnotationsFiles(@NotNull PsiModifierListOwner listOwner) { + return List.of(); + } + + @Override + public boolean hasConfiguredAnnotationRoot(@NotNull PsiModifierListOwner owner) { + return false; + } +} diff --git a/settings.gradle b/settings.gradle index 8c5fa61..a773252 100644 --- a/settings.gradle +++ b/settings.gradle @@ -42,3 +42,4 @@ include 'tests' include 'accesstransformers' include 'interfaceinjection' include 'unpick' +include 'sourcetest' \ No newline at end of file diff --git a/sourcetest/build.gradle b/sourcetest/build.gradle new file mode 100644 index 0000000..5456ed1 --- /dev/null +++ b/sourcetest/build.gradle @@ -0,0 +1,11 @@ +/** + * This project only serves to run the application with all plugins from IntelliJ + * while being able to step into original sources. + */ +dependencies { + implementation(project(':cli')) + implementation(project(':accesstransformers')) + implementation(project(':interfaceinjection')) + implementation(project(':parchment')) + implementation(project(':unpick')) +}