diff --git a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/rename/RenameService2.xtend b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/rename/RenameService2.xtend index a962a930e..c5ad2080d 100644 --- a/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/rename/RenameService2.xtend +++ b/org.eclipse.xtext.ide/src/org/eclipse/xtext/ide/server/rename/RenameService2.xtend @@ -35,6 +35,7 @@ import org.eclipse.xtext.ide.refactoring.RenameContext import org.eclipse.xtext.ide.serializer.IChangeSerializer import org.eclipse.xtext.ide.server.Document 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.util.NodeModelUtils import org.eclipse.xtext.parsetree.reconstr.impl.TokenUtil @@ -67,7 +68,9 @@ class RenameService2 implements IRenameService2 { @Inject TokenUtil tokenUtil @Inject IValueConverterService valueConverterService - + + @Inject LinkingHelper linkingHelper + Function attributeResolver = SimpleAttributeResolver.newResolver(String, 'name') override rename(Options options) { @@ -200,9 +203,9 @@ class RenameService2 implements IRenameService2 { if (element !== null && !element.eIsProxy) { val leaf = NodeModelUtils.findLeafNodeAtOffset(rootNode, candidateOffset) if (leaf !== null && leaf.isIdentifier) { - val leafText = getConvertedValue(leaf.grammarElement, leaf) + val convertedNameValue = getConvertedValue(leaf.grammarElement, leaf) 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 end = document.getPosition(leaf.endOffset) return Either.forLeft(new Range(start, end)) @@ -223,11 +226,16 @@ class RenameService2 implements IRenameService2 { } protected def String getConvertedValue(EObject grammarElement, ILeafNode leaf) { - switch (grammarElement) { - RuleCall: valueConverterService.toValue(leaf.text, grammarElement.rule.name, leaf).toString() - CrossReference: getConvertedValue(grammarElement.terminal, leaf) - default: leaf.text - } + try { + switch (grammarElement) { + RuleCall: return valueConverterService.toValue(leaf.text, grammarElement.rule.name, leaf).toString() + 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 } /** diff --git a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/rename/RenameService2.java b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/rename/RenameService2.java index e371490c6..16d4bf33d 100644 --- a/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/rename/RenameService2.java +++ b/org.eclipse.xtext.ide/xtend-gen/org/eclipse/xtext/ide/server/rename/RenameService2.java @@ -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.IRenameService2; 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.ILeafNode; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; @@ -92,6 +93,9 @@ public class RenameService2 implements IRenameService2 { @Inject private IValueConverterService valueConverterService; + @Inject + private LinkingHelper linkingHelper; + private Function attributeResolver = SimpleAttributeResolver.newResolver(String.class, "name"); @Override @@ -283,9 +287,9 @@ public class RenameService2 implements IRenameService2 { if (((element != null) && (!element.eIsProxy()))) { final ILeafNode leaf = NodeModelUtils.findLeafNodeAtOffset(rootNode, candidateOffset); 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); - 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 end = document.getPosition(leaf.getEndOffset()); Range _range = new Range(start, end); @@ -324,22 +328,25 @@ public class RenameService2 implements IRenameService2 { } protected String getConvertedValue(final EObject grammarElement, final ILeafNode leaf) { - String _switchResult = null; - boolean _matched = false; - if (grammarElement instanceof RuleCall) { - _matched=true; - _switchResult = this.valueConverterService.toValue(leaf.getText(), ((RuleCall)grammarElement).getRule().getName(), leaf).toString(); - } - if (!_matched) { - if (grammarElement instanceof CrossReference) { + try { + boolean _matched = false; + if (grammarElement instanceof RuleCall) { _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) { - _switchResult = leaf.getText(); - } - return _switchResult; + return leaf.getText(); } /** @@ -436,6 +443,11 @@ public class RenameService2 implements IRenameService2 { return this.valueConverterService; } + @Pure + protected LinkingHelper getLinkingHelper() { + return this.linkingHelper; + } + @Pure protected Function getAttributeResolver() { return this.attributeResolver;