package com.jetbrains.dart.analysisServer; import com.intellij.ide.hierarchy.HierarchyBrowserManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; import com.intellij.psi.PsiElement; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testFramework.codeInsight.hierarchy.HierarchyViewTestBase; import com.jetbrains.lang.dart.ide.hierarchy.method.DartMethodHierarchyTreeStructure; import com.jetbrains.lang.dart.ide.index.DartClassIndex; import com.jetbrains.lang.dart.psi.DartClass; import com.jetbrains.lang.dart.psi.DartComponent; import com.jetbrains.lang.dart.psi.DartComponentName; import com.jetbrains.lang.dart.util.DartTestUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; import java.util.List; import static com.jetbrains.dart.analysisServer.DartCallHierarchyTest.findReference; public class DartMethodHierarchyTest extends HierarchyViewTestBase { @Override public void setUp() throws Exception { super.setUp(); DartTestUtils.configureDartSdk(myModule, getTestRootDisposable(), true); VfsRootAccess.allowRootAccess(getTestRootDisposable(), getTestDataPath() + "/analysisServer/methodHierarchy/"); // Some tests do this here but resolution does not work if the server is initialized prior to copying the files. //DartAnalysisServerService.getInstance().serverReadyForRequest(getProject()); } @Override protected String getBasePath() { return "analysisServer/methodHierarchy/" + getTestName(false); } @Override protected String getTestDataPath() { return DartTestUtils.BASE_TEST_DATA_PATH; } @Override protected VirtualFile configureByFiles(@Nullable final File rawProjectRoot, @NotNull final VirtualFile... vFiles) throws IOException { VirtualFile root = super.configureByFiles(rawProjectRoot, vFiles); return DartTestUtils.configureNavigation(this, root, vFiles); } private void doMethodHierarchyTest(final String className, final String methodName, final boolean shouldHide, final String... fileNames) throws Exception { doHierarchyTest(() -> { final Project project = getProject(); final List<DartComponentName> dartComponentNames = DartClassIndex.getItemsByName(className, project, GlobalSearchScope.projectScope(project)); for (DartComponentName name : dartComponentNames) { DartClass dartClass = PsiTreeUtil.getParentOfType(name, DartClass.class); if (dartClass != null && className.equals(dartClass.getName())) { PsiElement member = dartClass.findMemberByName(methodName); if (member == null) { member = findReference(dartClass, methodName); } if (member == null) { fail("Method not found"); } if (shouldHide) { HierarchyBrowserManager.State state = HierarchyBrowserManager.getInstance(myProject).getState(); assert state != null; state.HIDE_CLASSES_WHERE_METHOD_NOT_IMPLEMENTED = true; } return new DartMethodHierarchyTreeStructure(project, (DartComponent)member); } } return null; }, fileNames); } private void doStandardMethodHierarchyTest(String className, String methodName, boolean shouldHide) throws Exception { doMethodHierarchyTest(className, methodName, shouldHide, "../t1.dart", "../t2.dart", "../t3.dart"); } public void testT1m() throws Exception { // If icons were in the XML then T1 would have base, all others '+' or '-' doStandardMethodHierarchyTest("T1", "m", false); } public void testT2m() throws Exception { // If icons were in the XML then C2x would have a '!' doStandardMethodHierarchyTest("T2", "m", false); } public void testC1m() throws Exception { // Class Z1 is not displayed doStandardMethodHierarchyTest("C1", "m", true); } public void testM1m() throws Exception { // Check mixin doStandardMethodHierarchyTest("M1", "m", true); } }