public boolean execute(@NotNull PsiElement psiElement, @NotNull ResolveState resolveState) { if (psiElement instanceof BashVarDef) { final BashVarDef varDef = (BashVarDef) psiElement; if (varDef.isStaticAssignmentWord() && !varDef.isCommandLocal() && !variableNames.contains(varDef.getName()) && BashVarUtils.isInDefinedScope(startElement, varDef)) { variables.add(varDef); variableNames.add(varDef.getName()); } } return true; }
return isInDefinedScope(referencingDefinition, definition);
@Test public void testValidScope() throws Exception { PsiReference variableReference = configure(); PsiFile included = addFile("included.bash"); PsiElement varDef = variableReference.resolve(); Assert.assertNotNull("The reference did not resolve", varDef); Assert.assertTrue("var def must resolve to the definition in included.bash", included.equals(varDef.getContainingFile())); Assert.assertTrue("The definition and usage scope must be valid", BashVarUtils.isInDefinedScope(variableReference.getElement(), (BashVarDef) varDef)); }
@Test public void testInvalidScope() throws Exception { PsiReference variableReference = configure(); PsiFile included = addFile("included.bash"); final BashVarDef[] includeVarDefs = {null}; //find the variable definition in the include file BashPsiUtils.visitRecursively(included, new BashVisitor() { @Override public void visitVarDef(BashVarDef varDef) { if ("VAR".equals(varDef.getName())) { includeVarDefs[0] = varDef; } } }); BashVarDef includeVarDef = includeVarDefs[0]; Assert.assertNotNull("The include file must contain a definition", includeVarDef); PsiElement varDef = variableReference.resolve(); Assert.assertNull("The variable must not resolve", varDef); Assert.assertFalse("The definition must not be a valid scope for the use (different files and use before inclusion)", BashVarUtils.isInDefinedScope(variableReference.getElement(), includeVarDef)); } }