Skip to content

Commit

Permalink
Resolve variables with multiple declarations (hello reuse variable lo…
Browse files Browse the repository at this point in the history
…vers!)
  • Loading branch information
idegtiarenko committed Oct 1, 2015
1 parent 7fd0646 commit b447043
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,10 @@ public static ConcordionVariableUsage findDeclaration(@NotNull ConcordionVariabl
if (varName == null) {
return null;
}

int varNameLength = varName.length();
int endOfScopePosition = findEndOfScopePosition(variable);
for (int pos = text.indexOf(varName);
pos != -1 && pos <= endOfScopePosition;
pos = text.indexOf(varName, pos+1)) {

for (int pos = text.lastIndexOf(varName, endOfScopePosition); pos >= 0; pos = text.lastIndexOf(varName, pos - varNameLength)) {
PsiElement elementAt = htmlSpec.findElementAt(pos);
if (elementAt != null) {
ConcordionVariableUsage usage = fromTokenAt(elementAt, pos);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public String getCanonicalText() {
@Override
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
owner.setName(newElementName);
return resolve();
return owner;
}

@Override
Expand Down
13 changes: 13 additions & 0 deletions testData/reference/ReuseVariable.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<html xmlns:c="http://www.concordion.org/2007/concordion">
<head>
<title>Test spec</title>
</head>
<body>

<span c:set="#var">var</span>
<span c:execute="consumeString(#var<caret>)">
<span c:set="#var">nested</span>
</span>

</body>
</html>
11 changes: 11 additions & 0 deletions testData/reference/ReuseVariable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.test;

import org.concordion.integration.junit4.ConcordionRunner;
import org.junit.runner.RunWith;

@RunWith(ConcordionRunner.class)
public class ReuseVariable {

public void consumeString(String s) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.gman.idea.plugin.concordion.lang.psi.ConcordionVariable;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;

import static org.assertj.core.api.Assertions.assertThat;

Expand Down Expand Up @@ -222,6 +223,25 @@ public void testShouldResolveReservedVariable() {
assertThat(declaration).isEqualTo(variable);
}

public void testShouldResolveLastAssignmentInCaseOfVariableReuse() {
//Should resolve inner var set as it executed last before method run
copyJavaRunnerToConcordionProject("ReuseVariable.java");
VirtualFile htmlSpec = copyHtmlSpecToConcordionProject("ReuseVariable.html");

myFixture.configureFromExistingVirtualFile(htmlSpec);

ConcordionVariable variable = elementUnderCaret();
ConcordionVariable declaration = resolveReferences(variable);

assertThat(declaration).isNotNull();
assertThat(declaration.getName()).isEqualTo("var");

//In this case variable declared on inner level after it is actually used on outer
assertThat(InjectedLanguageUtil.findInjectionHost(declaration).getTextOffset())
.isGreaterThan(InjectedLanguageUtil.findInjectionHost(variable).getTextOffset());

}

private <T extends PsiElement> T elementUnderCaret() {
return (T) myFixture.getFile().findElementAt(myFixture.getCaretOffset() - 1).getParent();
}
Expand Down

0 comments on commit b447043

Please sign in to comment.