|
|
|
|
Re: Validation with the Check Language across multiple files [message #647775 is a reply to message #647774] |
Sat, 08 January 2011 20:49 |
|
Hi,
here some quick and dirty code that das some kind of global uniqueness validation (this works only for objects that are exported and maybe not performant - maybe using a own impl of IResourceDescription.Manager might help when performance problems occur)
package org.xtext.example.mydsl.validation;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.IResourceDescription;
import org.eclipse.xtext.resource.IResourceDescriptions;
import org.eclipse.xtext.validation.Check;
import org.xtext.example.mydsl.myDsl.Element;
import org.xtext.example.mydsl.myDsl.MyDslPackage;
import com.google.inject.Inject;
public class MyDslJavaValidator extends AbstractMyDslJavaValidator {
@Inject
IResourceDescriptions resourceDescriptions;
@Check
public void checkGreetingStartsWithCapital(Element element) {
int count = 0;
for (Element e : getAllElements()) {
if (e.eIsProxy()) {
e = (Element) EcoreUtil.resolve(e, element);
}
if (element.getName().equals(e.getName())) {
count++;
}
}
if ( count >1 ) {
error("Nicht unique", MyDslPackage.ELEMENT);
}
}
private List<Element> getAllElements() {
List<Element> result = new ArrayList<Element>();
for (IResourceDescription resourceDescription : resourceDescriptions.getAllResourceDescriptions()) {
for (IEObjectDescription eobjectDescription : resourceDescription.getExportedObjects(MyDslPackage.eINSTANCE.getElement())) {
result.add((Element) eobjectDescription.getEObjectOrProxy());
}
}
return result;
}
}
~Christian
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
Re: Validation with the Check Language across multiple files [message #647776 is a reply to message #647775] |
Sat, 08 January 2011 21:00 |
|
And here some sample code with resource descriptions
package org.xtext.example.mydsl;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.resource.EObjectDescription;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.impl.DefaultResourceDescription;
import org.xtext.example.mydsl.myDsl.Element;
public class MyDslResourceDescription extends DefaultResourceDescription {
public MyDslResourceDescription(Resource resource,
IQualifiedNameProvider nameProvider) {
super(resource, nameProvider);
}
@Override
protected IEObjectDescription createIEObjectDescription(EObject from) {
if (from instanceof Element) {
if (getNameProvider() == null)
return null;
String qualifiedName = getNameProvider().getQualifiedName(from);
if (qualifiedName != null) {
Map<String, String> userData = new HashMap<String, String>();
userData.put("name", ((Element)from).getName());
return EObjectDescription.create(qualifiedName, from, userData );
}
}
return super.createIEObjectDescription(from);
}
}
package org.xtext.example.mydsl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.resource.IResourceDescription;
import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionManager;
public class MyDslResourceDescriptionManager extends
DefaultResourceDescriptionManager {
@Override
protected IResourceDescription internalGetResourceDescription(
Resource resource, IQualifiedNameProvider nameProvider) {
return new MyDslResourceDescription(resource, nameProvider);
}
}
/*
* generated by Xtext
*/
package org.xtext.example.mydsl;
import org.eclipse.xtext.resource.IResourceDescription;
/**
* Use this class to register components to be used at runtime / without the Equinox extension registry.
*/
public class MyDslRuntimeModule extends org.xtext.example.mydsl.AbstractMyDslRuntimeModule {
public Class<? extends IResourceDescription.Manager> bindIResourceDescriptionsManager() {
return MyDslResourceDescriptionManager.class;
}
}
package org.xtext.example.mydsl.validation;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.IResourceDescription;
import org.eclipse.xtext.resource.IResourceDescriptions;
import org.eclipse.xtext.validation.Check;
import org.xtext.example.mydsl.myDsl.Element;
import org.xtext.example.mydsl.myDsl.MyDslPackage;
import com.google.inject.Inject;
public class MyDslJavaValidator extends AbstractMyDslJavaValidator {
@Inject
IResourceDescriptions resourceDescriptions;
@Check
public void checkGreetingStartsWithCapital(Element element) {
int count = 0;
for (String name : getAllElementNames()) {
if (element.getName().equals(name)) {
count++;
}
}
if ( count >1 ) {
error("Nicht unique", MyDslPackage.ELEMENT);
}
}
private List<String> getAllElementNames() {
List<String> result = new ArrayList<String>();
for (IResourceDescription resourceDescription : resourceDescriptions.getAllResourceDescriptions()) {
for (IEObjectDescription eobjectDescription : resourceDescription.getExportedObjects(MyDslPackage.eINSTANCE.getElement())) {
result.add(eobjectDescription.getUserData("name"));
}
}
return result;
}
}
~Christian
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
|
|
|
|
Re: Validation with the Check Language across multiple files [message #869364 is a reply to message #647776] |
Thu, 03 May 2012 09:40 |
Brad Riching Messages: 20 Registered: May 2012 |
Junior Member |
|
|
Hello Christian,
I tried to implement your resource descriptions example, however the current version of xtext has some differences with the arguments to internalGetResourceDescription.
protected IResourceDescription internalGetResourceDescription(Resource resource, IDefaultResourceDescriptionStrategy strategy) {
return new DefaultResourceDescription(resource, strategy, cache);
}
As you probably are aware, it is now asking for an IDefaultResourceDescriptionStrategy instead of an IQualifiedNameProvider. It looks as though the indexing has been revamped to support the notion of a cached mechanism.
Would you mind updating your example to support the current version? I had some luck with your down'n'dirty example, but it is slow, and doesn't propagate the duplicate detection to all files including duplicates unless the files are saved, or a complete project build is executed. If I could get your resource descriptions example to work, I would be grateful.
|
|
|
|
Powered by
FUDForum. Page generated in 0.04205 seconds