package com.haskforce.codeInsight; import com.haskforce.HaskellLightPlatformCodeInsightFixtureTestCase; import com.haskforce.psi.HaskellCon; import com.haskforce.psi.HaskellConid; import com.haskforce.psi.HaskellVarid; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; public class HaskellGoToSymbolTest extends HaskellLightPlatformCodeInsightFixtureTestCase { public HaskellGoToSymbolTest() { super("codeInsight", "codeInsight"); } public void testGoToSymbolFunction_SymbolOnUsage(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("let seven") +4; PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertEquals(varId.getName(), referencedElement.getName()); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testNewtypeParameter(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("ResultVar param") +10; PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertEquals(varId.getName(), referencedElement.getName()); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_GADT(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("f (B _ end)") +7; PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertEquals(varId.getName(), referencedElement.getName()); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_Pattern_CaretOnVariable(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("let (seven") +5; PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset,referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_Monads_CaretOnVariable(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("seven <-"); PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset,referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_BehaveWhenCaretOutsideAFunction(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); PsiReference reference = psiElement.getReference(); assertNull(reference); } public void testGoToSymbolFunction_CaretOnFunctionInstance(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("test ::"); PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_CaretOnFunctionDeclaration(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("test ::"); PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertSame(psiElement, referencedElement); assertEquals(expectedStartOffset,referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_CanReferenceOtherFunction(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("test2 ::"); PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset,referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_ReferenceLeftMostFunctionWithoutTypeSig(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("test 1 ="); PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset,referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_WhereClause(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("where seven") + 6; PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset,referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolModuleDoesntResolveToDataConstructor(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid haskellConid = (HaskellConid) psiElement; PsiReference reference = haskellConid.getReference(); HaskellConid referencedElement = (HaskellConid)reference.resolve(); assertNull(referencedElement); } public void testGoToSymbolFunction_Records(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("Pool maybeA") + 5; PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset,referencedElement.getTextRange().getStartOffset()); } /** * TODO * Can only make this test work if findDefinitionNode returns the type declaration as well */ public void ignoreTestGoToSymbolFunction_RecordsType(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("data Pool") + 5; PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid)reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset,referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_RecordsConstructor(){ myFixture.configureByFile(getTestName(false)+".hs"); PsiFile file = myFixture.getFile(); String textOfFile = file.getText(); int expectedStartOffset= textOfFile.indexOf("Pool (Maybe a)"); PsiElement psiElement = file .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid)reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset,referencedElement.getTextRange().getStartOffset()); } /** * TODO : try to get these tests to follow the same approach as most others, with getTestName instead of lots of literal stuff */ public void testGoToSymbolFunction_TotalProject(){ PsiFile[] psiFiles = myFixture.configureByFiles( "TotalProject/DungeonMaster/Fight.hs", "TotalProject/Game/GameState.hs", "TotalProject/Board/Adventure/Adventure.hs", "TotalProject/Board/Follower/Follower.hs", "TotalProject/Board/Object/Object.hs", "TotalProject/Board/Space/Space.hs", "TotalProject/Character/Character.hs", "TotalProject/DungeonMaster/DungeonMaster.hs", "TotalProject/DungeonMaster/Movement.hs"); PsiFile dungeonMasterFight = psiFiles[0]; PsiFile gameGamestate = psiFiles[1]; String textOfFile = gameGamestate.getText(); int expectedStartOffset= textOfFile.indexOf("updatePlayer ::"); PsiElement psiElement = dungeonMasterFight .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid)reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset,referencedElement.getTextRange().getStartOffset()); /** * TODO maybe also compare the containg files of both elements to be the same. To be sure. * But likely a little bit overkill. Nevertheless. */ } public void testGoToSymbolFunction_QualifiedImport() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImport/Usage.hs", "QualifiedImport/Definition.hs" ); PsiFile usage = psiFiles[0]; PsiFile definition = psiFiles[1]; String textOfFile = definition.getText(); int expectedStartOffset = textOfFile.indexOf("seven ::"); PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImportNoAs() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImportNoAs/Usage.hs", "QualifiedImportNoAs/Definition.hs" ); PsiFile usage = psiFiles[0]; PsiFile definition = psiFiles[1]; String textOfFile = definition.getText(); int expectedStartOffset = textOfFile.indexOf("seven ::"); PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImportMultipleLevels() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImportMultipleLevels/Usage/Usage.hs", "QualifiedImportMultipleLevels/Definition/Definition.hs" ); PsiFile usage = psiFiles[0]; PsiFile definition = psiFiles[1]; String textOfFile = definition.getText(); int expectedStartOffset = textOfFile.indexOf("seven ::"); PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImportMultipleLevels_LocalFunctionWithSameName() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImportMultipleLevels_LocalFunctionWithSameName/Usage/Usage.hs", "QualifiedImportMultipleLevels_LocalFunctionWithSameName/Definition/Definition.hs" ); PsiFile usage = psiFiles[0]; PsiFile definition = psiFiles[1]; String textOfFile = definition.getText(); int expectedStartOffset = textOfFile.indexOf("seven ::"); PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImportMultipleLevels_LocalFunctionWithSameName_CaretOnLocal() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImportMultipleLevels_LocalFunctionWithSameName_CaretOnLocal/Usage/Usage.hs", "QualifiedImportMultipleLevels_LocalFunctionWithSameName_CaretOnLocal/Definition/Definition.hs" ); PsiFile usage = psiFiles[0]; String textOfFile = usage.getText(); int expectedStartOffset = textOfFile.indexOf("seven ::"); PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImportMultipleLevels_AsPartConsistsOfMultipleCons() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImportMultipleLevels_AsPartConsistsOfMultipleCons/Usage/Usage.hs", "QualifiedImportMultipleLevels_AsPartConsistsOfMultipleCons/Definition/Definition.hs" ); PsiFile usage = psiFiles[0]; PsiFile definition = psiFiles[1]; String textOfFile = definition.getText(); int expectedStartOffset = textOfFile.indexOf("seven ::"); PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellVarid varId = (HaskellVarid) psiElement; PsiReference reference = varId.getReference(); HaskellVarid referencedElement = (HaskellVarid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_ImportResolvesToModule() { PsiFile[] psiFiles = myFixture.configureByFiles( "ImportResolvesToModule/Usage.hs", "ImportResolvesToModule/Definition.hs" ); PsiFile usage = psiFiles[0]; PsiFile definition = psiFiles[1]; String textOfFile = definition.getText(); int expectedStartOffset = textOfFile.indexOf("module Definition") + 7; PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_ImportResolvesToModule_MultipleCons_OnModule() { PsiFile[] psiFiles = myFixture.configureByFiles( "ImportResolvesToModule_MultipleCons_OnModule/Usage.hs", "ImportResolvesToModule_MultipleCons_OnModule/Definition.hs" ); PsiFile usage = psiFiles[0]; PsiFile definition = psiFiles[1]; String textOfFile = definition.getText(); int expectedStartOffset = textOfFile.indexOf("module Definition.Definition") + 18; PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_ImportResolvesToModule_MultipleCons_OnPrefix() { PsiFile[] psiFiles = myFixture.configureByFiles( "ImportResolvesToModule_MultipleCons_OnPrefix/Usage.hs", "ImportResolvesToModule_MultipleCons_OnPrefix/Definition.hs" ); PsiFile usage = psiFiles[0]; PsiFile definition = psiFiles[1]; String textOfFile = definition.getText(); int expectedStartOffset = textOfFile.indexOf("module Definition.Definition") + 7; PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImportQualifierresolves() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImport_QualifierResolves/Usage.hs", "QualifiedImport_QualifierResolves/Definition.hs" ); PsiFile usage = psiFiles[0]; String textOfFile = usage.getText(); int expectedStartOffset = textOfFile.indexOf("as Def") + 3; PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImportQualifierresolvesMultipleCons_Cons1() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImport_QualifierResolvesMultipleCons_Cons1/Usage.hs", "QualifiedImport_QualifierResolvesMultipleCons_Cons1/Definition.hs" ); PsiFile usage = psiFiles[0]; String textOfFile = usage.getText(); int expectedStartOffset = textOfFile.indexOf("as Def.Lef") + 3; PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImportQualifierresolvesMultipleCons_Cons2() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImport_QualifierResolvesMultipleCons_Cons2/Usage.hs", "QualifiedImport_QualifierResolvesMultipleCons_Cons2/Definition.hs" ); PsiFile usage = psiFiles[0]; String textOfFile = usage.getText(); int expectedStartOffset = textOfFile.indexOf("as Def.Lef") + 7; PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImportQualifierresolvesMultipleCons_Cons1_NoAs() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImport_QualifierResolvesMultipleCons_Cons1_NoAs/Usage.hs", "QualifiedImport_QualifierResolvesMultipleCons_Cons1_NoAs/Definition.hs" ); PsiFile usage = psiFiles[0]; String textOfFile = usage.getText(); int expectedStartOffset = textOfFile.indexOf("qualified Definition.Definition") + 10; PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImportQualifierresolvesMultipleCons_Cons2_NoAs() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImport_QualifierResolvesMultipleCons_Cons2_NoAs/Usage.hs", "QualifiedImport_QualifierResolvesMultipleCons_Cons2_NoAs/Definition.hs" ); PsiFile usage = psiFiles[0]; String textOfFile = usage.getText(); int expectedStartOffset = textOfFile.indexOf("qualified Definition.Definition") + 21; PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImport_MultipleImportSameQualifiedName1() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImport_MultipleImportSameQualifiedName1/Usage/Usage.hs", "QualifiedImport_MultipleImportSameQualifiedName1/Definition/Definition.hs", "QualifiedImport_MultipleImportSameQualifiedName1/Other/Definition.hs" ); PsiFile usage = psiFiles[0]; String textOfFile = usage.getText(); int expectedStartOffset = textOfFile.indexOf("qualified Definition.Definition as Definition") + 35; PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } public void testGoToSymbolFunction_QualifiedImport_MultipleImportSameQualifiedName2() { PsiFile[] psiFiles = myFixture.configureByFiles( "QualifiedImport_MultipleImportSameQualifiedName2/Usage/Usage.hs", "QualifiedImport_MultipleImportSameQualifiedName2/Definition/Definition.hs", "QualifiedImport_MultipleImportSameQualifiedName2/Other/Definition.hs" ); PsiFile usage = psiFiles[0]; String textOfFile = usage.getText(); int expectedStartOffset = textOfFile.indexOf("qualified Other.Definition as Definition") + 30; PsiElement psiElement = usage .findElementAt(myFixture.getCaretOffset()).getParent(); HaskellConid conId = (HaskellConid) psiElement; PsiReference reference = conId.getReference(); HaskellConid referencedElement = (HaskellConid) reference.resolve(); assertNotSame(psiElement, referencedElement); assertEquals(expectedStartOffset, referencedElement.getTextRange().getStartOffset()); } }