[rename] applied feedback

This commit is contained in:
Jan Koehnlein 2020-05-12 09:42:19 +02:00
parent afe2878506
commit 95849c89c4
2 changed files with 43 additions and 23 deletions

View file

@ -35,6 +35,7 @@ import org.eclipse.xtext.ide.refactoring.RenameContext
import org.eclipse.xtext.ide.serializer.IChangeSerializer import org.eclipse.xtext.ide.serializer.IChangeSerializer
import org.eclipse.xtext.ide.server.Document import org.eclipse.xtext.ide.server.Document
import org.eclipse.xtext.ide.server.ILanguageServerAccess import org.eclipse.xtext.ide.server.ILanguageServerAccess
import org.eclipse.xtext.linking.impl.LinkingHelper
import org.eclipse.xtext.nodemodel.ILeafNode import org.eclipse.xtext.nodemodel.ILeafNode
import org.eclipse.xtext.nodemodel.util.NodeModelUtils import org.eclipse.xtext.nodemodel.util.NodeModelUtils
import org.eclipse.xtext.parsetree.reconstr.impl.TokenUtil import org.eclipse.xtext.parsetree.reconstr.impl.TokenUtil
@ -67,7 +68,9 @@ class RenameService2 implements IRenameService2 {
@Inject TokenUtil tokenUtil @Inject TokenUtil tokenUtil
@Inject IValueConverterService valueConverterService @Inject IValueConverterService valueConverterService
@Inject LinkingHelper linkingHelper
Function<EObject, String> attributeResolver = SimpleAttributeResolver.newResolver(String, 'name') Function<EObject, String> attributeResolver = SimpleAttributeResolver.newResolver(String, 'name')
override rename(Options options) { override rename(Options options) {
@ -200,9 +203,9 @@ class RenameService2 implements IRenameService2 {
if (element !== null && !element.eIsProxy) { if (element !== null && !element.eIsProxy) {
val leaf = NodeModelUtils.findLeafNodeAtOffset(rootNode, candidateOffset) val leaf = NodeModelUtils.findLeafNodeAtOffset(rootNode, candidateOffset)
if (leaf !== null && leaf.isIdentifier) { if (leaf !== null && leaf.isIdentifier) {
val leafText = getConvertedValue(leaf.grammarElement, leaf) val convertedNameValue = getConvertedValue(leaf.grammarElement, leaf)
val elementName = element.elementName val elementName = element.elementName
if (!leafText.nullOrEmpty && !elementName.nullOrEmpty && leafText == elementName) { if (!convertedNameValue.nullOrEmpty && !elementName.nullOrEmpty && convertedNameValue == elementName) {
val start = document.getPosition(leaf.offset) val start = document.getPosition(leaf.offset)
val end = document.getPosition(leaf.endOffset) val end = document.getPosition(leaf.endOffset)
return Either.forLeft(new Range(start, end)) return Either.forLeft(new Range(start, end))
@ -223,11 +226,16 @@ class RenameService2 implements IRenameService2 {
} }
protected def String getConvertedValue(EObject grammarElement, ILeafNode leaf) { protected def String getConvertedValue(EObject grammarElement, ILeafNode leaf) {
switch (grammarElement) { try {
RuleCall: valueConverterService.toValue(leaf.text, grammarElement.rule.name, leaf).toString() switch (grammarElement) {
CrossReference: getConvertedValue(grammarElement.terminal, leaf) RuleCall: return valueConverterService.toValue(leaf.text, grammarElement.rule.name, leaf).toString()
default: leaf.text CrossReference: return linkingHelper.getCrossRefNodeAsString(leaf, true)
} }
} catch (Exception exc) {
// The current name text cannot be converted to a value.
// Rename could be used to fix this.
}
return leaf.text
} }
/** /**

View file

@ -50,6 +50,7 @@ import org.eclipse.xtext.ide.server.ILanguageServerAccess;
import org.eclipse.xtext.ide.server.rename.ChangeConverter2; import org.eclipse.xtext.ide.server.rename.ChangeConverter2;
import org.eclipse.xtext.ide.server.rename.IRenameService2; import org.eclipse.xtext.ide.server.rename.IRenameService2;
import org.eclipse.xtext.ide.server.rename.ServerRefactoringIssueAcceptor; import org.eclipse.xtext.ide.server.rename.ServerRefactoringIssueAcceptor;
import org.eclipse.xtext.linking.impl.LinkingHelper;
import org.eclipse.xtext.nodemodel.ICompositeNode; import org.eclipse.xtext.nodemodel.ICompositeNode;
import org.eclipse.xtext.nodemodel.ILeafNode; import org.eclipse.xtext.nodemodel.ILeafNode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
@ -92,6 +93,9 @@ public class RenameService2 implements IRenameService2 {
@Inject @Inject
private IValueConverterService valueConverterService; private IValueConverterService valueConverterService;
@Inject
private LinkingHelper linkingHelper;
private Function<EObject, String> attributeResolver = SimpleAttributeResolver.<EObject, String>newResolver(String.class, "name"); private Function<EObject, String> attributeResolver = SimpleAttributeResolver.<EObject, String>newResolver(String.class, "name");
@Override @Override
@ -283,9 +287,9 @@ public class RenameService2 implements IRenameService2 {
if (((element != null) && (!element.eIsProxy()))) { if (((element != null) && (!element.eIsProxy()))) {
final ILeafNode leaf = NodeModelUtils.findLeafNodeAtOffset(rootNode, candidateOffset); final ILeafNode leaf = NodeModelUtils.findLeafNodeAtOffset(rootNode, candidateOffset);
if (((leaf != null) && this.isIdentifier(leaf))) { if (((leaf != null) && this.isIdentifier(leaf))) {
final String leafText = this.getConvertedValue(leaf.getGrammarElement(), leaf); final String convertedNameValue = this.getConvertedValue(leaf.getGrammarElement(), leaf);
final String elementName = this.getElementName(element); final String elementName = this.getElementName(element);
if ((((!StringExtensions.isNullOrEmpty(leafText)) && (!StringExtensions.isNullOrEmpty(elementName))) && Objects.equal(leafText, elementName))) { if ((((!StringExtensions.isNullOrEmpty(convertedNameValue)) && (!StringExtensions.isNullOrEmpty(elementName))) && Objects.equal(convertedNameValue, elementName))) {
final Position start = document.getPosition(leaf.getOffset()); final Position start = document.getPosition(leaf.getOffset());
final Position end = document.getPosition(leaf.getEndOffset()); final Position end = document.getPosition(leaf.getEndOffset());
Range _range = new Range(start, end); Range _range = new Range(start, end);
@ -324,22 +328,25 @@ public class RenameService2 implements IRenameService2 {
} }
protected String getConvertedValue(final EObject grammarElement, final ILeafNode leaf) { protected String getConvertedValue(final EObject grammarElement, final ILeafNode leaf) {
String _switchResult = null; try {
boolean _matched = false; boolean _matched = false;
if (grammarElement instanceof RuleCall) { if (grammarElement instanceof RuleCall) {
_matched=true;
_switchResult = this.valueConverterService.toValue(leaf.getText(), ((RuleCall)grammarElement).getRule().getName(), leaf).toString();
}
if (!_matched) {
if (grammarElement instanceof CrossReference) {
_matched=true; _matched=true;
_switchResult = this.getConvertedValue(((CrossReference)grammarElement).getTerminal(), leaf); return this.valueConverterService.toValue(leaf.getText(), ((RuleCall)grammarElement).getRule().getName(), leaf).toString();
}
if (!_matched) {
if (grammarElement instanceof CrossReference) {
_matched=true;
return this.linkingHelper.getCrossRefNodeAsString(leaf, true);
}
}
} catch (final Throwable _t) {
if (_t instanceof Exception) {
} else {
throw Exceptions.sneakyThrow(_t);
} }
} }
if (!_matched) { return leaf.getText();
_switchResult = leaf.getText();
}
return _switchResult;
} }
/** /**
@ -436,6 +443,11 @@ public class RenameService2 implements IRenameService2 {
return this.valueConverterService; return this.valueConverterService;
} }
@Pure
protected LinkingHelper getLinkingHelper() {
return this.linkingHelper;
}
@Pure @Pure
protected Function<EObject, String> getAttributeResolver() { protected Function<EObject, String> getAttributeResolver() {
return this.attributeResolver; return this.attributeResolver;