private static void createValueResource( @NotNull PsiFile file, @NotNull AndroidFacet facet, @NotNull PsiDirectory dir, @NotNull final String resName, @NotNull final String value, @NotNull final ResourceType type, @NotNull final String oldTagText) { final String filename = file.getName(); final List<String> dirNames = Collections.singletonList(dir.getName()); final Module module = facet.getModule(); final AtomicReference<PsiElement> openAfter = new AtomicReference<PsiElement>(); final WriteCommandAction<Void> action = new WriteCommandAction<Void>( facet.getModule().getProject(), "Override Resource " + resName, file) { @Override protected void run(@NotNull Result<Void> result) { List<ResourceElement> elements = Lists.newArrayListWithExpectedSize(1); // AndroidResourceUtil.createValueResource will create a new resource value in the given // resource // folder (and record the corresponding tags added in the elements list passed into it). // However, it only creates a new element and sets the name attribute on it; it does not // transfer attributes, child content etc. Therefore, we use this utility method first // to // create the corresponding tag, and then *afterwards* we will replace the tag with a // text copy // from the resource tag we are overriding. We do this all under a single write lock // such // that it becomes a single atomic operation. AndroidResourceUtil.createValueResource( module, resName, type, filename, dirNames, value, elements); if (elements.size() == 1) { final XmlTag tag = elements.get(0).getXmlTag(); if (tag != null && tag.isValid()) { try { XmlTag tagFromText = XmlElementFactory.getInstance(tag.getProject()).createTagFromText(oldTagText); PsiElement replaced = tag.replace(tagFromText); openAfter.set(replaced); } catch (IncorrectOperationException e) { // The user tried to override an invalid XML fragment: don't attempt to do a // replacement in that case openAfter.set(tag); } } } } }; action.execute(); PsiElement tag = openAfter.get(); if (tag != null) { NavigationUtil.openFileWithPsiElement(tag, true, true); } }
protected void doTest(final String extension) throws Exception { CommandProcessor.getInstance() .executeCommand( getProject(), () -> WriteCommandAction.runWriteCommandAction( null, () -> { String fileName = getTestName(false) + extension; try { String text = loadFile(fileName); PsiFile file = createFile(fileName, text); JavaCodeStyleManager.getInstance(myProject).optimizeImports(file); PostprocessReformattingAspect.getInstance(getProject()) .doPostponedFormatting(); PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); String textAfter = loadFile(getTestName(false) + "_after" + extension); String fileText = file.getText(); assertEquals(textAfter, fileText); } catch (Exception e) { LOG.error(e); } }), "", ""); }
public void testFoldRegionsUpdate() throws IOException { String text = "import java.util.List;\n" + "import java.util.ArrayList;\n" + "\n" + "class Test {\n" + "}"; init(40, text); final int foldStartOffset = "import".length() + 1; int foldEndOffset = text.indexOf("class") - 2; addCollapsedFoldRegion(foldStartOffset, foldEndOffset, "..."); // Simulate addition of the new import that modifies existing fold region. WriteCommandAction.runWriteCommandAction( getProject(), () -> myEditor.getDocument().insertString(foldEndOffset, "\nimport java.util.Date;\n")); final FoldingModel foldingModel = myEditor.getFoldingModel(); foldingModel.runBatchFoldingOperation( () -> { FoldRegion oldFoldRegion = getFoldRegion(foldStartOffset); assertNotNull(oldFoldRegion); foldingModel.removeFoldRegion(oldFoldRegion); int newFoldEndOffset = myEditor.getDocument().getText().indexOf("class") - 2; FoldRegion newFoldRegion = foldingModel.addFoldRegion(foldStartOffset, newFoldEndOffset, "..."); assertNotNull(newFoldRegion); newFoldRegion.setExpanded(false); }); CodeFoldingManager.getInstance(getProject()).updateFoldRegions(myEditor); assertEquals( new VisualPosition(2, 0), myEditor.logicalToVisualPosition(new LogicalPosition(5, 0))); }
@Override protected void runTest() throws Throwable { if (getTestName(false).contains("NoVerify")) { super.runTest(); return; } boolean oldVerify = RedBlackTree.VERIFY; RedBlackTree.VERIFY = !isPerformanceTest(); final Throwable[] ex = {null}; try { if (getTestName(false).contains("NoCommand")) { super.runTest(); return; } WriteCommandAction.runWriteCommandAction( getProject(), new ThrowableComputable<Void, Throwable>() { @Override public Void compute() throws Throwable { RangeMarkerTest.super.runTest(); return null; } }); } finally { RedBlackTree.VERIFY = oldVerify; } if (ex[0] != null) throw ex[0]; }
public void testSoftWrapCacheReset() throws IOException { // Inspired by IDEA-76537 - the point is to drop cached document info on complete soft wraps // recalculation String text = "\t first line\n" + "\t second line\n" + "\t third line"; // Make soft wraps to build a document info cache. init(40, text); // Modify document while soft wraps processing is off. final EditorSettings settings = getEditor().getSettings(); settings.setUseSoftWraps(false); int startOffset = text.indexOf("\t third") - 1; WriteCommandAction.runWriteCommandAction( getProject(), () -> getEditor().getDocument().deleteString(startOffset, text.length())); // Enable soft wraps and ensure that the cache is correctly re-built. settings.setUseSoftWraps(true); getEditor().getCaretModel().moveToOffset(getEditor().getDocument().getTextLength()); type("\n test"); final int offset = getEditor().getDocument().getTextLength() - 1; final LogicalPosition logicalPosition = getEditor().offsetToLogicalPosition(offset); assertEquals(offset, getEditor().logicalPositionToOffset(logicalPosition)); final VisualPosition visualPosition = getEditor().offsetToVisualPosition(offset); assertEquals(visualPosition, getEditor().logicalToVisualPosition(logicalPosition)); assertEquals(logicalPosition, getEditor().visualToLogicalPosition(visualPosition)); }
private void performAction( String from, String to, final int docCommentPolicy, String[] expectedConflicts, final String[] toPullUp) { final JSClassResolver resolver = JSDialectSpecificHandlersFactory.forLanguage(JavaScriptSupportLoader.ECMA_SCRIPT_L4) .getClassResolver(); final JSClass sourceClass = (JSClass) resolver.findClassByQName(from, GlobalSearchScope.projectScope(getProject())); assertNotNull("source class not found: " + sourceClass, sourceClass); final JSClass targetClass = (JSClass) resolver.findClassByQName(to, GlobalSearchScope.projectScope(getProject())); assertNotNull("target class not found: " + targetClass, targetClass); assertTrue( "Source should be a subclass of target", JSInheritanceUtil.isParentClass(sourceClass, targetClass)); final List<JSMemberInfo> memberInfos = getMemberInfos(toPullUp, sourceClass, false); final JSMemberInfo[] infosArray = JSMemberInfo.getSelected(memberInfos, sourceClass, Conditions.<JSMemberInfo>alwaysTrue()); MultiMap<PsiElement, String> conflicts = JSPullUpConflictsUtil.checkConflicts( infosArray, sourceClass, targetClass, new JSInterfaceContainmentVerifier() { @Override public boolean checkedInterfacesContain(JSFunction psiMethod) { return JSPullUpHelper.checkedInterfacesContain(memberInfos, psiMethod); } }, JSVisibilityUtil.DEFAULT_OPTIONS); ArrayList<String> messages = new ArrayList<String>(conflicts.values()); for (int i = 0; i < messages.size(); i++) { messages.set(i, messages.get(i).replaceAll("<[^>]+>", "")); } assertSameElements(messages, expectedConflicts); if (conflicts.isEmpty()) { WriteCommandAction.runWriteCommandAction( null, new Runnable() { public void run() { new JSPullUpHelper(sourceClass, targetClass, infosArray, docCommentPolicy) .moveMembersToBase(); myProject.getComponent(PostprocessReformattingAspect.class).doPostponedFormatting(); } }); FileDocumentManager.getInstance().saveAllDocuments(); } }
public void testMoveWithFoldRegionInside() throws Exception { initText("abc\ndef\nghi\n"); configureSoftWraps(100); addCollapsedFoldRegion(0, 4, "..."); WriteCommandAction.runWriteCommandAction( getProject(), () -> ((DocumentEx) myEditor.getDocument()).moveText(0, 4, 12)); assertEquals( new LogicalPosition(2, 0), myEditor.visualToLogicalPosition(new VisualPosition(2, 1))); }
private void checkOperatorPrecedence( @NotNull final String firstLine, @NotNull String resultPrefix) throws Exception { myFixture.configureByFile("/refactoring/inlinelocal/operatorPrecedence/template.py"); WriteCommandAction.runWriteCommandAction( myFixture.getProject(), () -> myFixture.getEditor().getDocument().insertString(0, firstLine + "\n")); PsiDocumentManager.getInstance(myFixture.getProject()).commitAllDocuments(); performRefactoring(null); myFixture.checkResultByFile( "/refactoring/inlinelocal/operatorPrecedence/" + resultPrefix + ".after.py"); FileDocumentManager.getInstance().reloadFromDisk(myFixture.getDocument(myFixture.getFile())); }
public void testInsertStringAtCaretNotMovingCaret() throws Exception { configureFromFileText(getTestName(false) + ".txt", "text <caret>"); WriteCommandAction.runWriteCommandAction( getProject(), new Runnable() { @Override public void run() { EditorModificationUtil.insertStringAtCaret(myEditor, " ", false, false); } }); checkResultByText("text <caret> "); }
public void testFoldRegionEndingAtLineStart() throws IOException { init(100, "aaa\nbbb\nccc\nddd"); addCollapsedFoldRegion(4, 8, "..."); addCollapsedFoldRegion(13, 15, "..."); WriteCommandAction.runWriteCommandAction( getProject(), () -> myEditor.getDocument().insertString(10, "C")); // verify that cached layout data is intact after document change and position recalculation is // done correctly assertEquals( new LogicalPosition(0, 0), myEditor.visualToLogicalPosition(new VisualPosition(0, 0))); }
private void doGenerate( final Editor editor, final PsiFile file, final PsiClass targetClass, final TestFramework framework) { if (framework instanceof JavaTestFramework && ((JavaTestFramework) framework).isSingleConfig()) { PsiElement alreadyExist = null; switch (myMethodKind) { case SET_UP: alreadyExist = framework.findSetUpMethod(targetClass); break; case TEAR_DOWN: alreadyExist = framework.findTearDownMethod(targetClass); break; default: break; } if (alreadyExist instanceof PsiMethod) { editor.getCaretModel().moveToOffset(alreadyExist.getNavigationElement().getTextOffset()); HintManager.getInstance() .showErrorHint( editor, "Method " + ((PsiMethod) alreadyExist).getName() + " already exists"); return; } } if (!CommonRefactoringUtil.checkReadOnlyStatus(file)) return; WriteCommandAction.runWriteCommandAction( file.getProject(), new Runnable() { @Override public void run() { try { PsiDocumentManager.getInstance(file.getProject()).commitAllDocuments(); PsiMethod method = generateDummyMethod(editor, file); if (method == null) return; TestIntegrationUtils.runTestMethodTemplate( myMethodKind, framework, editor, targetClass, method, "name", false, null); } catch (IncorrectOperationException e) { HintManager.getInstance() .showErrorHint(editor, "Cannot generate method: " + e.getMessage()); LOG.warn(e); } } }); }
protected static void delete(@NotNull final VirtualFile file) { WriteCommandAction.runWriteCommandAction( null, new Runnable() { @Override public void run() { try { file.delete(null); } catch (IOException e) { throw new RuntimeException(e); } } }); }
@SuppressWarnings("ConstantConditions") public void testCustomTagCompletion0() throws Throwable { final VirtualFile labelViewJava = copyFileToProject("LabelView.java", "src/p1/p2/LabelView.java"); VirtualFile lf1 = myFixture.copyFileToProject(testFolder + '/' + "ctn0.xml", "res/layout/layout1.xml"); myFixture.configureFromExistingVirtualFile(lf1); myFixture.complete(CompletionType.BASIC); List<String> variants = myFixture.getLookupElementStrings(); assertTrue(variants.contains("p1.p2.LabelView")); final PsiFile psiLabelViewFile = PsiManager.getInstance(getProject()).findFile(labelViewJava); assertInstanceOf(psiLabelViewFile, PsiJavaFile.class); final PsiClass labelViewClass = ((PsiJavaFile) psiLabelViewFile).getClasses()[0]; assertNotNull(labelViewClass); myFixture.renameElement(labelViewClass, "LabelView1"); VirtualFile lf2 = myFixture.copyFileToProject(testFolder + '/' + "ctn0.xml", "res/layout/layout2.xml"); myFixture.configureFromExistingVirtualFile(lf2); myFixture.complete(CompletionType.BASIC); variants = myFixture.getLookupElementStrings(); assertFalse(variants.contains("p1.p2.LabelView")); assertTrue(variants.contains("p1.p2.LabelView1")); WriteCommandAction.runWriteCommandAction( null, new Runnable() { @Override public void run() { try { labelViewJava.delete(null); } catch (IOException e) { throw new RuntimeException(e); } } }); VirtualFile lf3 = myFixture.copyFileToProject(testFolder + '/' + "ctn0.xml", "res/layout/layout3.xml"); myFixture.configureFromExistingVirtualFile(lf3); myFixture.complete(CompletionType.BASIC); variants = myFixture.getLookupElementStrings(); assertFalse(variants.contains("p1.p2.LabelView")); assertFalse(variants.contains("p1.p2.LabelView1")); }
public void testSavedUncommittedDocument() throws IOException { VirtualFile dir = getVirtualFile(createTempDirectory()); PsiTestUtil.addSourceContentToRoots(myModule, dir); final VirtualFile vFile = createChildData(dir, "Foo.java"); VfsUtil.saveText(vFile, ""); final GlobalSearchScope scope = GlobalSearchScope.allScope(getProject()); final JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject()); assertNull(facade.findClass("Foo", scope)); WriteCommandAction.runWriteCommandAction( null, new Runnable() { @Override public void run() { PsiFile psiFile = PsiManager.getInstance(getProject()).findFile(vFile); assertNotNull(psiFile); long count = PsiManager.getInstance(myProject).getModificationTracker().getModificationCount(); Document document = FileDocumentManager.getInstance().getDocument(vFile); document.insertString(0, "class Foo {}"); FileDocumentManager.getInstance().saveDocument(document); assertTrue( count == PsiManager.getInstance(myProject) .getModificationTracker() .getModificationCount()); assertNull(facade.findClass("Foo", scope)); PsiDocumentManager.getInstance(myProject).commitAllDocuments(); assertNotNull(facade.findClass("Foo", scope)); assertNotNull(facade.findClass("Foo", scope).getText()); // if Foo exists now, mod count should be different assertTrue( count != PsiManager.getInstance(myProject) .getModificationTracker() .getModificationCount()); } }); }
public void testOnClickIntention() throws Throwable { myFixture.copyFileToProject(testFolder + "/OnClickActivity.java", "src/p1/p2/Activity1.java"); final VirtualFile file = copyFileToProject("onClickIntention.xml"); myFixture.configureFromExistingVirtualFile(file); final AndroidCreateOnClickHandlerAction action = new AndroidCreateOnClickHandlerAction(); assertTrue( action.isAvailable(myFixture.getProject(), myFixture.getEditor(), myFixture.getFile())); WriteCommandAction.runWriteCommandAction( null, new Runnable() { @Override public void run() { action.invoke(myFixture.getProject(), myFixture.getEditor(), myFixture.getFile()); } }); myFixture.checkResultByFile(testFolder + "/onClickIntention.xml"); myFixture.checkResultByFile( "src/p1/p2/Activity1.java", testFolder + "/OnClickActivity_after.java", false); }
public void testOnClickQuickFix2() throws Throwable { myFixture.enableInspections(AndroidMissingOnClickHandlerInspection.class); myFixture.copyFileToProject(testFolder + "/OnClickActivity1.java", "src/p1/p2/Activity1.java"); final VirtualFile file = copyFileToProject("onClickIntention.xml"); myFixture.configureFromExistingVirtualFile(file); final List<IntentionAction> actions = highlightAndFindQuickFixes(AndroidMissingOnClickHandlerInspection.MyQuickFix.class); assertEquals(1, actions.size()); WriteCommandAction.runWriteCommandAction( null, new Runnable() { @Override public void run() { actions.get(0).invoke(getProject(), myFixture.getEditor(), myFixture.getFile()); } }); myFixture.checkResultByFile(testFolder + "/onClickIntention.xml"); myFixture.checkResultByFile( "src/p1/p2/Activity1.java", testFolder + "/OnClickActivity1_after.java", false); }
@Override protected void runTest() throws Throwable { if (isRunInWriteAction()) { WriteCommandAction.runWriteCommandAction( getProject(), new ThrowableComputable<Void, Throwable>() { @Override public Void compute() throws Throwable { doRunTest(); return null; } }); } else { new WriteCommandAction.Simple(getProject()) { @Override protected void run() throws Throwable { doRunTest(); } }.performCommand(); } }
public void testCollectedPsiWithChangedDocument() throws IOException { VirtualFile dir = getVirtualFile(createTempDirectory()); PsiTestUtil.addSourceContentToRoots(myModule, dir); final VirtualFile vFile = createChildData(dir, "Foo.java"); VfsUtil.saveText(vFile, "class Foo {}"); final GlobalSearchScope scope = GlobalSearchScope.allScope(getProject()); final JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject()); assertNotNull(facade.findClass("Foo", scope)); WriteCommandAction.runWriteCommandAction( null, new Runnable() { @Override public void run() { PsiFile psiFile = PsiManager.getInstance(getProject()).findFile(vFile); assertNotNull(psiFile); Document document = FileDocumentManager.getInstance().getDocument(vFile); document.deleteString(0, document.getTextLength()); assertNotNull(facade.findClass("Foo", scope)); psiFile = null; PlatformTestUtil.tryGcSoftlyReachableObjects(); assertNull( ((PsiManagerEx) PsiManager.getInstance(getProject())) .getFileManager() .getCachedPsiFile(vFile)); PsiClass foo = facade.findClass("Foo", scope); assertNotNull(foo); assertTrue(foo.isValid()); assertEquals("class Foo {}", foo.getText()); assertTrue(foo.isValid()); PsiDocumentManager.getInstance(myProject).commitAllDocuments(); assertNull(facade.findClass("Foo", scope)); } }); }
private List<PsiFile> createPropertiesFiles() { final Set<String> fileNames = getFileNamesToCreate(); final List<PsiFile> createdFiles = WriteCommandAction.runWriteCommandAction( myProject, new Computable<List<PsiFile>>() { @Override public List<PsiFile> compute() { return ReadAction.compute( () -> ContainerUtil.map( fileNames, n -> { final boolean isXml = myResourceBundle == null ? myUseXMLBasedPropertiesCheckBox.isSelected() : myResourceBundle.getDefaultPropertiesFile() instanceof XmlPropertiesFile; if (isXml) { FileTemplate template = FileTemplateManager.getInstance(myProject) .getInternalTemplate("XML Properties File.xml"); LOG.assertTrue(template != null); try { return (PsiFile) FileTemplateUtil.createFromTemplate( template, n, null, myDirectory); } catch (Exception e) { throw new RuntimeException(e); } } else { return myDirectory.createFile(n); } })); } }); combineToResourceBundleIfNeed(createdFiles); return createdFiles; }
public void testModificationOfSoftWrappedFoldRegion() throws IOException { String text = "import java.util.List;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;\n" + "import java.util.LinkedList;\n" + "import java.util.Set;\n" + "\n" + "class Test {\n" + "}"; init(40, text); final int foldStartOffset = text.indexOf("java.util.Collections"); final int foldEndOffset = text.indexOf("class") - 2; addCollapsedFoldRegion(foldStartOffset, foldEndOffset, "..."); int modificationOffset = text.indexOf("java.util.Set"); WriteCommandAction.runWriteCommandAction( getProject(), () -> myEditor.getDocument().insertString(modificationOffset, "import java.util.HashSet;\n")); // Used to get StackOverflowError here, hence, no additional checking is performed. }