|
|
|
|
|
|
Re: How to find the cross-references of an Eobject across files? [message #1835576 is a reply to message #1835572] |
Mon, 07 December 2020 13:26   |
|
Hello Giray,
The following code snippet demonstrates the usage of the IReferenceFinder interface from the ActivityGenerator class:
package org.xtext.example.mydsl.generator
import com.google.inject.Inject
import com.google.inject.Provider
import org.eclipse.core.runtime.NullProgressMonitor
import org.eclipse.emf.common.util.URI
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.emf.ecore.util.EcoreUtil
import org.eclipse.xtext.findReferences.IReferenceFinder
import org.eclipse.xtext.findReferences.IReferenceFinder.IResourceAccess
import org.eclipse.xtext.findReferences.TargetURIs
import org.eclipse.xtext.resource.IReferenceDescription
import org.eclipse.xtext.resource.IResourceDescriptions
import org.xtext.example.mydsl.myDsl.Activity
import org.xtext.example.mydsl.myDsl.ActivityModel
class ActivityGenerator {
@Inject IReferenceFinder referenceFinder
@Inject Provider<TargetURIs> targetURIProvider
@Inject IResourceDescriptions resourceDescriptions
def generate(ActivityModel activityModel) '''
«FOR activity : activityModel.activities»
Activity «activity.name» is referenced by «getReferenceCount(activity)» component activities.
«ENDFOR»
'''
def getReferenceCount(Activity activity) {
val acceptor = new MyDslReferenceAcceptor
val uri = EcoreUtil.getURI(activity)
val targetURIs = targetURIProvider.get
targetURIs.addURI(uri)
referenceFinder.findAllReferences(targetURIs, null, resourceDescriptions, acceptor, new NullProgressMonitor)
return acceptor.count
}
}
class MyDslReferenceAcceptor implements IReferenceFinder.Acceptor {
int count = 0
override accept(IReferenceDescription description) {
count++
}
override accept(EObject source, URI sourceURI, EReference eReference, int index, EObject targetOrProxy, URI targetURI) {
}
def getCount() {
count
}
}
Hope that helps,
Tamás
|
|
|
|
Re: How to find the cross-references of an Eobject across files? [message #1835651 is a reply to message #1835641] |
Wed, 09 December 2020 13:38   |
|
You should inject the ActivityGenerator into the MyDslGenerator so that all members in the ActivityGenerator gets injected:
class MyDslGenerator extends AbstractGenerator {
@Inject ActivityGenerator activityGenerator
override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
val model = (resource.allContents.head as Head).model
if (model instanceof ActivityModel) {
val activityModel = model as ActivityModel
fsa.generateFile("Activities.txt", activityGenerator.generate(activityModel))
}
}
}
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.02556 seconds