From e8b85e2942a469fd5ab1ee207a48057aa6f68117 Mon Sep 17 00:00:00 2001
From: Philip Makedonski <makedonski@cs.uni-goettingen.de>
Date: Thu, 11 Jan 2024 20:48:42 +0100
Subject: [PATCH] + automated/implicit type assignment for enum data instances
 #66

---
 .../mts/tdl/TDLtxDerivedStateComputer.java    | 36 +++++++++++++++++++
 .../org/etsi/mts/tdl/TDLtxRuntimeModule.java  | 33 +++++++++++++++++
 2 files changed, 69 insertions(+)
 create mode 100644 plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxDerivedStateComputer.java

diff --git a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxDerivedStateComputer.java b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxDerivedStateComputer.java
new file mode 100644
index 00000000..bbe330a4
--- /dev/null
+++ b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxDerivedStateComputer.java
@@ -0,0 +1,36 @@
+package org.etsi.mts.tdl;
+
+import java.util.List;
+
+import org.eclipse.xtext.EcoreUtil2;
+import org.eclipse.xtext.resource.DerivedStateAwareResource;
+import org.eclipse.xtext.resource.IDerivedStateComputer;
+
+//TODO: move upstream
+class TDLtxDerivedStateComputer implements IDerivedStateComputer {
+	
+	@Override
+	public void installDerivedState(DerivedStateAwareResource resource, boolean preLinkingPhase) {
+		List<EnumDataType> enums = EcoreUtil2.getAllContentsOfType(resource.getContents().get(0), EnumDataType.class);
+		enums.forEach(e-> {
+			e.getValue().forEach(v -> v.setDataType(e));
+		});
+//		//TODO: also for gate references (instead of in scope?)
+//		List<GateReference> grs = EcoreUtil2.getAllContentsOfType(resource.getContents().get(0), GateReference.class);
+//		grs.forEach(e-> e.setName(e.getName()==null ? 
+//				null //e.getComponent().getName()+"_"+e.getGate().getName() 
+//				: e.getName()));
+//		grs.forEach(e-> System.out.println(e.getName()));
+	}
+
+	@Override
+	public void discardDerivedState(DerivedStateAwareResource resource) {
+		List<EnumDataType> enums = EcoreUtil2.getAllContentsOfType(resource.getContents().get(0), EnumDataType.class);
+		enums.forEach(e-> {
+			e.getValue().forEach(v -> v.setDataType(null));
+		});
+//		//TODO: also for gate references (instead of in scope?)
+//		List<GateReference> grs = EcoreUtil2.getAllContentsOfType(resource.getContents().get(0), GateReference.class);
+//		grs.forEach(e-> e.setName(null));
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxRuntimeModule.java b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxRuntimeModule.java
index 7147cf32..c1d1d2e3 100644
--- a/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxRuntimeModule.java
+++ b/plugins/org.etsi.mts.tdl.tx/src/org/etsi/mts/tdl/TDLtxRuntimeModule.java
@@ -6,7 +6,15 @@ package org.etsi.mts.tdl;
 import org.eclipse.xtext.conversion.IValueConverterService;
 import org.eclipse.xtext.naming.IQualifiedNameConverter;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.resource.DerivedStateAwareResource;
+import org.eclipse.xtext.resource.DerivedStateAwareResourceDescriptionManager;
+import org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy;
+import org.eclipse.xtext.resource.IDerivedStateComputer;
+import org.eclipse.xtext.resource.IResourceDescription;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.scoping.IGlobalScopeProvider;
 import org.etsi.mts.tdl.scoping.TDLQualifiedNameConverter;
+import org.etsi.mts.tdl.scoping.TDLtxGlobalScopeProvider;
 import org.etsi.mts.tdl.scoping.TdlQualifiedNameProvider;
 
 /**
@@ -24,4 +32,29 @@ public class TDLtxRuntimeModule extends AbstractTDLtxRuntimeModule {
 	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
 		return TdlQualifiedNameProvider.class;
 	}
+
+	public Class<? extends IDerivedStateComputer> bindIDerivedStateComputer() {
+		return TDLtxDerivedStateComputer.class;
+	}
+
+	// Not needed for Xbase-projects
+	@Override
+	public Class<? extends XtextResource> bindXtextResource() {
+		return DerivedStateAwareResource.class;
+	}
+
+	// Not needed for Xbase-projects
+	public Class<? extends IResourceDescription.Manager> bindIResourceDescriptionManager() {
+		return DerivedStateAwareResourceDescriptionManager.class;
+	}
+
+//	public Class<? extends IDefaultResourceDescriptionStrategy> bindIDefaultResourceDescriptionStrategy() {
+//		return RDS.class;
+//	}
+	
+//	@Override
+//	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+//		return TDLtxGlobalScopeProvider.class;
+//	}
+
 }
-- 
GitLab