|
Re: (XText 1.0) importUri and ProposalProvider [message #789291 is a reply to message #787997] |
Thu, 02 February 2012 20:24 |
|
Hi,
you have basically these options
(1) resolve the proxy (which might be slow and you have to overwrite all the stuff up to org.eclipse.xtext.ui.editor.contentassist.AbstractJavaBasedContentProposalProvider.DefaultProposalCreator.apply(IEObjectDescription)
where you have access to the context which gives you an model object you can resolve against)
(2) enrich the IEObjectDescriptions with the Information you need (which might be painful since you have to provide a custom IResourceDescription.Manager)
~Christian
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
Re: (XText 1.0) importUri and ProposalProvider [message #808241 is a reply to message #787997] |
Mon, 27 February 2012 15:14 |
Philippe Palau Messages: 13 Registered: February 2011 |
Junior Member |
|
|
Hi Christian,
Thanks for your help.
I'm sorry, i did not receive (or saw) notification about your post and just found it yesterday.
I used resolve proxy, it's slow but it works. I created generic behaviour in the ProposalProvider to resolve crossref using ScopeProvider (maybe it's not a good thing). I put the code, it could help some users.
public class GvbscriptProposalProvider extends AbstractGvbscriptProposalProvider {
@Inject
IScopeProvider scopeProvider;
@Override
public void completeAssignment(Assignment assignment, ContentAssistContext contentAssistContext, ICompletionProposalAcceptor acceptor) {
//when assignment is a crossreference
if(CrossReference.class.isAssignableFrom(assignment.getTerminal().getClass())){
CrossReference crossReference = (CrossReference)assignment.getTerminal();
ParserRule containingParserRule = GrammarUtil.containingParserRule(crossReference);
if (!GrammarUtil.isDatatypeRule(containingParserRule)) {
//Look for complete method override
boolean existsMethodOverride;
try {
String methodName = "complete" + Strings.toFirstUpper(containingParserRule.getName()) + "_" + Strings.toFirstUpper(assignment.getFeature());
Method completeMethod = this.getClass().getMethod(methodName, EObject.class, Assignment.class, ContentAssistContext.class, ICompletionProposalAcceptor.class);
existsMethodOverride = (completeMethod.getDeclaringClass().equals(this.getClass()));
} catch (Exception e) {
existsMethodOverride = false;
}
//No complete method override, Use generic complete method for crossReference
if(!existsMethodOverride){
completeUsingScopeProvider(crossReference, contentAssistContext, acceptor);
}
}
}
//Use standard base method.
super.completeAssignment(assignment, contentAssistContext, acceptor);
}
//
// Custom complete methods override ...
//
/**
* Create proposal with scope provider
*
* @param crossReference
* @param contentAssistContext
* @param acceptor
*/
protected void completeUsingScopeProvider(CrossReference crossReference, ContentAssistContext contentAssistContext,
ICompletionProposalAcceptor acceptor) {
EReference target = GrammarUtil.getReference(crossReference);
if(target == null){
return;
}
//Request elements to the scope provider
EObject currentModelElement = contentAssistContext.getCurrentModel();
IScope scope = scopeProvider.getScope(currentModelElement, target);
for (IEObjectDescription scopeElement : scope.getAllContents()) {
//Get element and resolve proxy if needed
EObject object = scopeElement.getEObjectOrProxy();
if (object.eIsProxy()) {
object = EcoreUtil.resolve(object, currentModelElement.eResource());
}
//Create new proposal
String label = getLabelProvider().getText(object);
if(label == null || label.equals("")){
label = scopeElement.getName();
}
ICompletionProposal completionProposal = createCompletionProposal(scopeElement.getName(),
getLabelProvider().getText(object), null, contentAssistContext);
//Register proposal
acceptor.accept(completionProposal);
}
}
}
Thanks Again.
P. Palau
|
|
|
Powered by
FUDForum. Page generated in 0.02191 seconds