I just can't figure out how to implement ImportURI scoping for my plugin. I've had a look at the Xtext documentation, and also this blog post: http://www.eclipse.org/forums/index.php/mv/msg/207406/664109/#msg_664109
... but I'm still doing something wrong .
Perhaps someone can tell me what's missing in the example below?
My example grammar looks like this:
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Model: statements+=Statement*;
Statement: Import | Function | Execute ;
Import : 'Import' ImportURI=STRING ;
Function: 'Function' name=ID 'END';
Execute : 'Execute' name=[Function];
My "test project" looks like this:
\MyProject\File1.dsl
Function PlantTree END
Function WaterTree END
\MyProject\File2.dsl
\MyProject\File3.dsl
Import 'file1.dsl'
// these should resolve (File1.dsl):
Execute PlantTree
Execute WaterTree
// this should error (File2.dsl not imported):
Execute PruneTree
I have made the following changes to the xtext project:
Modified:
...
var grammarURI = "classpath:/org/xtext/example/mydsl/MyDsl.xtext"
var file.extensions = "dsl"
var projectName = "org.xtext.example.mydsl"
var runtimeProject = "../${projectName}"
...etc
// java-based API for validation
fragment = validation.JavaValidatorFragment {
composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
// composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
// registerForImportedPackages = true
}
// scoping and exporting API
fragment = scoping.ImportURIScopingFragment {}
fragment = exporting.SimpleNamesFragment {}
// scoping and exporting API
// fragment = scoping.ImportNamespacesScopingFragment {}
// fragment = exporting.QualifiedNamesFragment {}
// fragment = builder.BuilderIntegrationFragment {}
... etc
Modified:
public class MyDslRuntimeModule extends org.xtext.example.mydsl.AbstractMyDslRuntimeModule {
public Class<? extends ImportUriResolver> bindimporturiResolver() {
return MyDslImportUriResolver.class;
}
}
New class:
public class MyDslImportUriResolver extends ImportUriResolver {
@Override
public String resolve(EObject object) {
return "platform:/resource/MyProject/"+super.resolve(object);
}
}
New class:
public class MyDslImportUriGlobalScopeProvider extends ImportUriGlobalScopeProvider{
@Override
public IScope getScope(EObject context, EReference reference) {
return super.getScope(context, reference);
}
}
What else am I missing? (Thanks in advance)
[Updated on: Fri, 03 June 2011 06:15]
Report message to a moderator