如果缓存交叉引用,则不会重命名交叉引用
Renaming of cross references not happening if the cross references are cached
我有一个正在使用的示例模型,如下所示
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;
我在下面的代码中添加了对作用域的缓存支持:
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 时,只有定义中的变量被重命名。引用没有被重命名。没有缓存它工作正常,但是当缓存完成后,我遇到了这个问题。我在这里错过了什么?
谢谢,
安妮莎
你缓存错了
reference.eResource
您需要使用上下文资源作为缓存而不是元模型
context.eResource,
我有一个正在使用的示例模型,如下所示
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;
我在下面的代码中添加了对作用域的缓存支持:
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 时,只有定义中的变量被重命名。引用没有被重命名。没有缓存它工作正常,但是当缓存完成后,我遇到了这个问题。我在这里错过了什么?
谢谢,
安妮莎
你缓存错了
reference.eResource
您需要使用上下文资源作为缓存而不是元模型
context.eResource,