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";
}