diff --git a/annotations/src/main/java/net/staticstudios/data/Column.java b/annotations/src/main/java/net/staticstudios/data/Column.java index 6045f880..fa6e271c 100644 --- a/annotations/src/main/java/net/staticstudios/data/Column.java +++ b/annotations/src/main/java/net/staticstudios/data/Column.java @@ -7,6 +7,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) +@ImplicitWrite public @interface Column { String name(); diff --git a/annotations/src/main/java/net/staticstudios/data/ForeignColumn.java b/annotations/src/main/java/net/staticstudios/data/ForeignColumn.java index 0efb1acc..0ce9eb2e 100644 --- a/annotations/src/main/java/net/staticstudios/data/ForeignColumn.java +++ b/annotations/src/main/java/net/staticstudios/data/ForeignColumn.java @@ -7,6 +7,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) +@ImplicitWrite public @interface ForeignColumn { String name(); diff --git a/annotations/src/main/java/net/staticstudios/data/IdColumn.java b/annotations/src/main/java/net/staticstudios/data/IdColumn.java index 5c0db8ae..0199cff8 100644 --- a/annotations/src/main/java/net/staticstudios/data/IdColumn.java +++ b/annotations/src/main/java/net/staticstudios/data/IdColumn.java @@ -7,6 +7,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) +@ImplicitWrite public @interface IdColumn { String name(); } diff --git a/annotations/src/main/java/net/staticstudios/data/Identifier.java b/annotations/src/main/java/net/staticstudios/data/Identifier.java index 963e0144..87c6bfa7 100644 --- a/annotations/src/main/java/net/staticstudios/data/Identifier.java +++ b/annotations/src/main/java/net/staticstudios/data/Identifier.java @@ -10,6 +10,7 @@ */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) +@ImplicitWrite public @interface Identifier { String value(); diff --git a/annotations/src/main/java/net/staticstudios/data/ImplicitWrite.java b/annotations/src/main/java/net/staticstudios/data/ImplicitWrite.java new file mode 100644 index 00000000..895a9b65 --- /dev/null +++ b/annotations/src/main/java/net/staticstudios/data/ImplicitWrite.java @@ -0,0 +1,4 @@ +package net.staticstudios.data; + +public @interface ImplicitWrite { +} diff --git a/annotations/src/main/java/net/staticstudios/data/ManyToMany.java b/annotations/src/main/java/net/staticstudios/data/ManyToMany.java index a03ed03d..4ee22dd6 100644 --- a/annotations/src/main/java/net/staticstudios/data/ManyToMany.java +++ b/annotations/src/main/java/net/staticstudios/data/ManyToMany.java @@ -8,6 +8,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) +@ImplicitWrite public @interface ManyToMany { /** * How should this relation be linked? diff --git a/annotations/src/main/java/net/staticstudios/data/OneToMany.java b/annotations/src/main/java/net/staticstudios/data/OneToMany.java index 436bb961..573aaca1 100644 --- a/annotations/src/main/java/net/staticstudios/data/OneToMany.java +++ b/annotations/src/main/java/net/staticstudios/data/OneToMany.java @@ -8,6 +8,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) +@ImplicitWrite public @interface OneToMany { /** * How should this relation be linked? diff --git a/annotations/src/main/java/net/staticstudios/data/OneToOne.java b/annotations/src/main/java/net/staticstudios/data/OneToOne.java index b19c8ddc..199ddbe1 100644 --- a/annotations/src/main/java/net/staticstudios/data/OneToOne.java +++ b/annotations/src/main/java/net/staticstudios/data/OneToOne.java @@ -8,6 +8,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) +@ImplicitWrite public @interface OneToOne { /** * How should this relation be linked? diff --git a/intellij-plugin/src/main/java/net/staticstudios/data/ide/intellij/DataImplicitUsageProvider.java b/intellij-plugin/src/main/java/net/staticstudios/data/ide/intellij/DataImplicitUsageProvider.java new file mode 100644 index 00000000..7e971773 --- /dev/null +++ b/intellij-plugin/src/main/java/net/staticstudios/data/ide/intellij/DataImplicitUsageProvider.java @@ -0,0 +1,30 @@ +package net.staticstudios.data.ide.intellij; + +import com.intellij.codeInsight.daemon.ImplicitUsageProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiField; +import net.staticstudios.data.utils.Constants; +import org.jetbrains.annotations.NotNull; + +public class DataImplicitUsageProvider implements ImplicitUsageProvider { + + @Override + public boolean isImplicitUsage(@NotNull PsiElement psiElement) { + return false; + } + + @Override + public boolean isImplicitRead(@NotNull PsiElement psiElement) { + return false; + } + + @Override + public boolean isImplicitWrite(@NotNull PsiElement psiElement) { + if (!(psiElement instanceof PsiField field)) { + return false; + } + + return IntelliJPluginUtils.hasAnnotationRecursive(field, Constants.IMPLICIT_WRITE_FQN); + } + +} diff --git a/intellij-plugin/src/main/java/net/staticstudios/data/ide/intellij/IntelliJPluginUtils.java b/intellij-plugin/src/main/java/net/staticstudios/data/ide/intellij/IntelliJPluginUtils.java index 71a7b2a3..6470c5c8 100644 --- a/intellij-plugin/src/main/java/net/staticstudios/data/ide/intellij/IntelliJPluginUtils.java +++ b/intellij-plugin/src/main/java/net/staticstudios/data/ide/intellij/IntelliJPluginUtils.java @@ -1,8 +1,11 @@ package net.staticstudios.data.ide.intellij; +import com.intellij.lang.jvm.annotation.JvmAnnotationAttribute; import com.intellij.psi.*; import net.staticstudios.data.utils.Constants; +import java.util.Arrays; + public class IntelliJPluginUtils { public static boolean genericTypeIs(PsiType type, String classFqn) { if (!(type instanceof PsiClassType psiClassType)) { @@ -43,9 +46,39 @@ public static boolean hasAnnotation(PsiModifierListOwner element, String annotat if (element.getModifierList() == null) { return false; } + return element.getModifierList().findAnnotation(annotationFqn) != null; } + public static boolean hasAnnotationRecursive(PsiModifierListOwner element, String annotationFqn) { + if (element.getModifierList() == null) { + return false; + } + + if (hasAnnotation(element, annotationFqn)) { + return true; + } + + for (PsiAnnotation annotation : element.getModifierList().getAnnotations()) { + PsiJavaCodeReferenceElement referenceElement = annotation.getNameReferenceElement(); + + if (referenceElement == null) { + continue; + } + + PsiElement resolved = referenceElement.resolve(); + if (!(resolved instanceof PsiClass psiClass)) { + continue; + } + + if (hasAnnotationRecursive(psiClass, annotationFqn)) { + return true; + } + } + + return false; + } + public static PsiType getGenericParameter(PsiClassType type, PsiManager manager) { PsiType[] params = type.getParameters(); return (params.length > 0) ? params[0] : PsiType.getJavaLangObject(manager, type.getResolveScope()); diff --git a/intellij-plugin/src/main/resources/META-INF/plugin.xml b/intellij-plugin/src/main/resources/META-INF/plugin.xml index b0ff6b64..fff80378 100644 --- a/intellij-plugin/src/main/resources/META-INF/plugin.xml +++ b/intellij-plugin/src/main/resources/META-INF/plugin.xml @@ -14,5 +14,7 @@ + + diff --git a/utils/src/main/java/net/staticstudios/data/utils/Constants.java b/utils/src/main/java/net/staticstudios/data/utils/Constants.java index d058be5b..7abcdb66 100644 --- a/utils/src/main/java/net/staticstudios/data/utils/Constants.java +++ b/utils/src/main/java/net/staticstudios/data/utils/Constants.java @@ -20,5 +20,6 @@ public class Constants { public static final String INSERT_MODE_FQN = "net.staticstudios.data.InsertMode"; public static final String INSERT_CONTEXT_FQN = "net.staticstudios.data.insert.InsertContext"; public static final String BATCH_INSERT_FQN = "net.staticstudios.data.insert.BatchInsert"; + public static final String IMPLICIT_WRITE_FQN = "net.staticstudios.data.ImplicitWrite"; }