如果交叉引用被缓存,则不会重命名交叉引用

时间:2018-02-23 10:39:29

标签: eclipse-plugin xtext

我有一个我正在使用的样本模型

grammar org.xtext.example.testdsl.TestDsl with org.eclipse.xtext.common.Terminals
generate testDsl "http://www.xtext.com/test/example/TestDsl"

Model:
prog+=Program*;

Program: g=Greeting  de+=DataEntry* s+=Statement*;
Greeting: 'Hello' t=ProgPara '!';
ProgPara: 'PROGRAM'  pname=Progname ';';
Progname : name=ID;

DataEntry:  a=INT (v=Varname| in=Indexname) ';';   
Varname : name = ID;

Statement: c=CopyStmt ';';
CopyStmt: 'COPY' 'TO' qname=[IndexVarname|ID] ;
IndexVarname : (Indexname|Varname);   
Indexname : '(' name = ID ')';

Named:Progname|Indexname|Varname;

我在下面的代码中添加了对Scoping的缓存支持:

class TestDslScopeProvider extends AbstractTestDslScopeProvider {
@Inject
IResourceScopeCache cache;

override getScope(EObject context, EReference reference) {
    if (context instanceof CopyStmt) {
        if (reference.featureID == TestDslPackage.COPY_STMT__QNAME) {
            val candidates = cache.get(
                "COPY_STMT__QNAME_scope",
                reference.eResource,
                [|findQNameCandidates(context, reference)]
            );
            return Scopes.scopeFor(candidates);
        }   
        }
        return super.getScope(context, reference);      
  }

  def findQNameCandidates(EObject context, EReference reference) {
    val rootElement = EcoreUtil2.getRootContainer(context);
    val candidates1 = EcoreUtil2.getAllContentsOfType(rootElement, IndexVarname);
    return candidates1;
  }
}

现在我有一个示例测试用例如下:

Hello PROGRAM test;!
1 test1;
2 (test4);
3 test3;

COPY TO test4;
COPY TO test4;

当我尝试使用重命名元素重命名test4时,只会重命名定义中的变量。引用未被重命名。没有缓存它工作正常,但是当缓存完成后,我遇到了这个问题。我在这里缺少什么?

谢谢,
Anitha

1 个答案:

答案 0 :(得分:0)

你做错误

reference.eResource

您需要将上下文资源用作缓存而不是元模型

context.eResource,