From e5a1281f04df24757241b342bd6a7533972ab11a Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 29 Apr 2010 19:22:55 +0400 Subject: [PATCH 01/11] fix some bugs; tests --- .../template/zencoding/XmlZenCodingInterpreter.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java index 2f74ada15052..81e8d2303057 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java @@ -79,7 +79,7 @@ class XmlZenCodingInterpreter { PsiFile file = myCallback.parseCurrentText(StdFileTypes.XML); PsiElement element = file.findElementAt(offset); - if (element instanceof XmlToken && ((XmlToken)element).getTokenType() == XmlTokenType.XML_END_TAG_START) { + if (offset < endOfTemplate && element instanceof XmlToken && ((XmlToken)element).getTokenType() == XmlTokenType.XML_END_TAG_START) { return; } @@ -94,7 +94,9 @@ class XmlZenCodingInterpreter { } if (newOffset >= 0) { - myCallback.fixEndOffset(); + if (offset < endOfTemplate) { + myCallback.fixEndOffset(); + } myCallback.moveToOffset(newOffset); } } @@ -231,8 +233,10 @@ class XmlZenCodingInterpreter { final Object key = new Object(); myCallback.fixStartOfTemplate(key); for (int i = startIndex; i < count; i++) { + Object iterKey = new Object(); + myCallback.fixStartOfTemplate(iterKey); invokeTemplate(templateToken, myCallback, i); - gotoChild(key); + gotoChild(iterKey); interpret(myTokens, tailStart, myCallback, State.WORD, mySurroundedText); if (myCallback.getOffset() != myCallback.getEndOfTemplate(key)) { myCallback.fixEndOffset(); From a63a0299637bd262f499dfb3a5b73ea13985326d Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Thu, 29 Apr 2010 21:36:00 +0400 Subject: [PATCH 02/11] refactoring; do more work while parsing template --- .../template/zencoding/TemplateToken.java | 2 + .../zencoding/XmlZenCodingInterpreter.java | 128 +++++------------- .../zencoding/XmlZenCodingTemplate.java | 60 ++++++-- .../template/zencoding/ZenCodingTemplate.java | 10 -- 4 files changed, 91 insertions(+), 109 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/TemplateToken.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/TemplateToken.java index bb9b2f96b0f6..e2cec092ad44 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/TemplateToken.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/TemplateToken.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.template.zencoding; import com.intellij.codeInsight.template.impl.TemplateImpl; import com.intellij.openapi.util.Pair; +import com.intellij.psi.xml.XmlTag; import java.util.List; @@ -27,6 +28,7 @@ class TemplateToken extends Token { final String myKey; final List> myAttribute2Value; TemplateImpl myTemplate; + public XmlTag myTag; TemplateToken(String key, List> attribute2value) { myKey = key; diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java index 81e8d2303057..78579667fd69 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java @@ -25,18 +25,13 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.xml.XmlChildRole; -import com.intellij.psi.xml.XmlTag; -import com.intellij.psi.xml.XmlToken; -import com.intellij.psi.xml.XmlTokenType; +import com.intellij.psi.xml.*; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; import com.intellij.util.containers.IntArrayList; -import com.intellij.xml.util.HtmlUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -246,7 +241,7 @@ class XmlZenCodingInterpreter { finish(); } - private static boolean containsAttrsVar(TemplateImpl template) { + static boolean containsAttrsVar(TemplateImpl template) { for (int i = 0; i < template.getVariableCount(); i++) { String varName = template.getVariableNameAt(i); if (ATTRS.equals(varName)) { @@ -275,17 +270,7 @@ class XmlZenCodingInterpreter { @Nullable private static Map buildPredefinedValues(List> attribute2value, int numberInIteration) { - StringBuilder result = new StringBuilder(); - for (Iterator> it = attribute2value.iterator(); it.hasNext();) { - Pair pair = it.next(); - String name = pair.first; - String value = getValue(pair, numberInIteration); - result.append(name).append("=\"").append(value).append('"'); - if (it.hasNext()) { - result.append(' '); - } - } - String attributes = result.toString(); + String attributes = buildAttributesString(attribute2value, numberInIteration); attributes = attributes.length() > 0 ? ' ' + attributes : null; Map predefinedValues = null; if (attributes != null) { @@ -295,66 +280,37 @@ class XmlZenCodingInterpreter { return predefinedValues; } - private static String getValue(Pair pair, int numberInIteration) { - return pair.second.replace(NUMBER_IN_ITERATION_PLACE_HOLDER, Integer.toString(numberInIteration + 1)); + @NotNull + private static String buildAttributesString(List> attribute2value, int numberInIteration) { + StringBuilder result = new StringBuilder(); + for (Iterator> it = attribute2value.iterator(); it.hasNext();) { + Pair pair = it.next(); + String name = pair.first; + String value = getValue(pair, numberInIteration); + result.append(getAttributeString(name, value)); + if (it.hasNext()) { + result.append(' '); + } + } + return result.toString(); } - @Nullable - private static String addAttrsVar(TemplateImpl modifiedTemplate, XmlTag tag) { - String text = tag.getContainingFile().getText(); - PsiElement[] children = tag.getChildren(); - if (children.length >= 1 && - children[0] instanceof XmlToken && - ((XmlToken)children[0]).getTokenType() == XmlTokenType.XML_START_TAG_START) { - PsiElement beforeAttrs = children[0]; - if (children.length >= 2 && children[1] instanceof XmlToken && ((XmlToken)children[1]).getTokenType() == XmlTokenType.XML_NAME) { - beforeAttrs = children[1]; - } - TextRange range = beforeAttrs.getTextRange(); - if (range == null) { - return null; - } - int offset = range.getEndOffset(); - text = text.substring(0, offset) + " $ATTRS$" + text.substring(offset); - modifiedTemplate.addVariable(ATTRS, "", "", false); - return text; - } - return null; + private static String getAttributeString(String name, String value) { + return name + "=\"" + value + '"'; + } + + private static String getValue(Pair pair, int numberInIteration) { + return pair.second.replace(NUMBER_IN_ITERATION_PLACE_HOLDER, Integer.toString(numberInIteration + 1)); } private static void invokeTemplate(TemplateToken token, final CustomTemplateCallback callback, int numberInIteration) { List> attr2value = new ArrayList>(token.myAttribute2Value); - if (callback.isLiveTemplateApplicable(token.myKey)) { - invokeExistingLiveTemplate(token, callback, numberInIteration, attr2value); - } - else { - TemplateImpl template = new TemplateImpl("", ""); - template.addTextSegment('<' + token.myKey); - if (attr2value.size() > 0) { - template.addVariable(ATTRS, "", "", false); - template.addVariableSegment(ATTRS); - } - template.addTextSegment(">"); - if (XmlZenCodingTemplate.isTrueXml(callback) || !HtmlUtil.isSingleHtmlTag(token.myKey)) { - template.addVariableSegment(TemplateImpl.END); - template.addTextSegment(""); - } - template.setToReformat(true); - Map predefinedValues = buildPredefinedValues(attr2value, numberInIteration); - callback.expandTemplate(template, predefinedValues); - } - } - - private static void invokeExistingLiveTemplate(TemplateToken token, - CustomTemplateCallback callback, - int numberInIteration, - List> attr2value) { if (token.myTemplate != null) { if (attr2value.size() > 0 || XmlZenCodingTemplate.isTrueXml(callback)) { TemplateImpl modifiedTemplate = token.myTemplate.copy(); - XmlTag tag = XmlZenCodingTemplate.parseXmlTagInTemplate(token.myTemplate.getString(), callback, true); + XmlTag tag = token.myTag; if (tag != null) { for (Iterator> iterator = attr2value.iterator(); iterator.hasNext();) { Pair pair = iterator.next(); @@ -363,27 +319,7 @@ class XmlZenCodingInterpreter { iterator.remove(); } } - if (XmlZenCodingTemplate.isTrueXml(callback)) { - closeUnclosingTags(tag); - } - String text = null; - if (!containsAttrsVar(modifiedTemplate) && attr2value.size() > 0) { - String textWithAttrs = addAttrsVar(modifiedTemplate, tag); - if (textWithAttrs != null) { - text = textWithAttrs; - } - else { - for (Iterator> iterator = attr2value.iterator(); iterator.hasNext();) { - Pair pair = iterator.next(); - tag.setAttribute(pair.first, getValue(pair, numberInIteration)); - iterator.remove(); - } - } - } - if (text == null) { - text = tag.getContainingFile().getText(); - } - modifiedTemplate.setString(text); + modifiedTemplate.setString(filter(tag, callback)); removeVariablesWhichHasNoSegment(modifiedTemplate); Map predefinedValues = buildPredefinedValues(attr2value, numberInIteration); callback.expandTemplate(modifiedTemplate, predefinedValues); @@ -393,11 +329,19 @@ class XmlZenCodingInterpreter { callback.expandTemplate(token.myTemplate, null); } else { + // for CSS Map predefinedValues = buildPredefinedValues(attr2value, numberInIteration); callback.expandTemplate(token.myKey, predefinedValues); } } + private static String filter(XmlTag tag, CustomTemplateCallback callback) { + if (XmlZenCodingTemplate.isTrueXml(callback)) { + closeUnclosingTags(tag); + } + return tag.getContainingFile().getText(); + } + private static boolean isTagClosed(@NotNull XmlTag tag) { ASTNode node = tag.getNode(); assert node != null; @@ -410,15 +354,16 @@ class XmlZenCodingInterpreter { private static void closeUnclosingTags(@NotNull XmlTag root) { final List> tagToClose = new ArrayList>(); Project project = root.getProject(); - final SmartPointerManager manager = SmartPointerManager.getInstance(project); + final SmartPointerManager pointerManager = SmartPointerManager.getInstance(project); root.accept(new XmlRecursiveElementVisitor() { @Override public void visitXmlTag(final XmlTag tag) { if (!isTagClosed(tag)) { - tagToClose.add(manager.createLazyPointer(tag)); + tagToClose.add(pointerManager.createLazyPointer(tag)); } } }); + PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); for (final SmartPsiElementPointer pointer : tagToClose) { final XmlTag tag = pointer.getElement(); if (tag != null) { @@ -428,6 +373,7 @@ class XmlZenCodingInterpreter { VirtualFile file = tag.getContainingFile().getVirtualFile(); if (file != null) { final Document document = FileDocumentManager.getInstance().getDocument(file); + documentManager.doPostponedOperationsAndUnblockDocument(document); ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { document.replaceString(offset, tag.getTextRange().getEndOffset(), "/>"); @@ -437,7 +383,7 @@ class XmlZenCodingInterpreter { } } } - PsiDocumentManager.getInstance(project).commitAllDocuments(); + documentManager.commitAllDocuments(); } private static void fail() { diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java index ab40993e31d7..8beb9b2a2788 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java @@ -27,15 +27,18 @@ import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; +import com.intellij.psi.XmlElementFactory; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.*; import com.intellij.util.LocalTimeCounter; import com.intellij.util.containers.HashSet; +import com.intellij.xml.util.HtmlUtil; import org.apache.xerces.util.XML11Char; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Set; @@ -192,19 +195,60 @@ public class XmlZenCodingTemplate extends ZenCodingTemplate { if (useDefaultTag && token.myAttribute2Value.size() == 0) { return null; } - if (template != null && (token.myAttribute2Value.size() > 0 || isTrueXml(callback))) { - assert prefix.equals(token.myKey); - token.myTemplate = template; - if (token.myAttribute2Value.size() > 0) { - XmlTag tag = parseXmlTagInTemplate(template.getString(), callback, false); - if (tag == null) { - return null; - } + if (template == null) { + template = generateTagTemplate(token.myKey, callback); + } + assert prefix.equals(token.myKey); + token.myTemplate = template; + XmlTag tag = parseXmlTagInTemplate(template.getString(), callback, true); + if (token.myAttribute2Value.size() > 0 && tag == null) { + return null; + } + if (tag != null) { + if (!XmlZenCodingInterpreter.containsAttrsVar(template) && token.myAttribute2Value.size() > 0) { + addMissingAttributes(tag, token.myAttribute2Value); } + token.myTag = tag; } return token; } + private static void addMissingAttributes(XmlTag tag, List> value) { + List> attr2value = new ArrayList>(value); + for (Iterator> iterator = attr2value.iterator(); iterator.hasNext();) { + Pair pair = iterator.next(); + if (tag.getAttribute(pair.first) != null) { + iterator.remove(); + } + } + addAttributesBefore(tag, attr2value); + } + + private static void addAttributesBefore(XmlTag tag, List> attr2value) { + XmlAttribute[] attributes = tag.getAttributes(); + XmlAttribute firstAttribute = attributes.length > 0 ? attributes[0] : null; + XmlElementFactory factory = XmlElementFactory.getInstance(tag.getProject()); + for (Pair pair : attr2value) { + XmlAttribute xmlAttribute = factory.createXmlAttribute(pair.first, ""); + if (firstAttribute != null) { + tag.addBefore(xmlAttribute, firstAttribute); + } + else { + tag.add(xmlAttribute); + } + } + } + + @NotNull + private static TemplateImpl generateTagTemplate(String tagName, CustomTemplateCallback callback) { + StringBuilder builder = new StringBuilder("<"); + builder.append(tagName).append('>'); + if (isTrueXml(callback) || !HtmlUtil.isSingleHtmlTag(tagName)) { + builder.append("$END$'); + } + return new TemplateImpl("", builder.toString(), ""); + } + @Nullable static XmlTag parseXmlTagInTemplate(String templateString, CustomTemplateCallback callback, boolean createPhysicalFile) { XmlFile xmlFile = (XmlFile)PsiFileFactory.getInstance(callback.getProject()) diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java index 9f0257f01e25..8b03c4f3b5c9 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java @@ -154,16 +154,6 @@ public abstract class ZenCodingTemplate implements CustomLiveTemplate { protected boolean checkTemplateKey(String key, CustomTemplateCallback callback) { List tokens = parse(key, callback); if (tokens != null && check(tokens)) { - // !! required if Zen Coding if invoked by TemplateManagerImpl action - /*if (tokens.size() == 2) { - Token token = tokens.get(0); - if (token instanceof TemplateToken) { - if (key.equals(((TemplateToken)token).myKey) && callback.isLiveTemplateApplicable(key)) { - // do not activate only live template - return null; - } - } - }*/ return true; } return false; From 4d1741037ea428af5286134c02973a2d7fbed12a Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 7 May 2010 12:30:42 +0400 Subject: [PATCH 03/11] multi resolve for references to css classes in GWT --- .../com/intellij/psi/PsiElementResolveResult.java | 14 ++++++++++++++ .../intellij/psi/PsiPolyVariantReferenceBase.java | 11 +++++++++++ 2 files changed, 25 insertions(+) diff --git a/platform/lang-api/src/com/intellij/psi/PsiElementResolveResult.java b/platform/lang-api/src/com/intellij/psi/PsiElementResolveResult.java index 129bfff446bf..3d43bc2b55bf 100644 --- a/platform/lang-api/src/com/intellij/psi/PsiElementResolveResult.java +++ b/platform/lang-api/src/com/intellij/psi/PsiElementResolveResult.java @@ -18,6 +18,9 @@ package com.intellij.psi; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; /** * Trivial implementation of {@link ResolveResult}. @@ -67,4 +70,15 @@ public class PsiElementResolveResult implements ResolveResult{ public String toString() { return "PsiElementResolveResult: " + (myElement instanceof PsiNamedElement ? ((PsiNamedElement)myElement).getName() : myElement.getText()); } + + public static ResolveResult[] createResults(@Nullable Collection elements) { + if (elements == null || elements.isEmpty()) return EMPTY_ARRAY; + + final ResolveResult[] results = new ResolveResult[elements.size()]; + int i = 0; + for (PsiElement element : elements) { + results[i++] = new PsiElementResolveResult(element); + } + return results; + } } diff --git a/platform/lang-api/src/com/intellij/psi/PsiPolyVariantReferenceBase.java b/platform/lang-api/src/com/intellij/psi/PsiPolyVariantReferenceBase.java index 50b4e585eee3..aa2d99396790 100644 --- a/platform/lang-api/src/com/intellij/psi/PsiPolyVariantReferenceBase.java +++ b/platform/lang-api/src/com/intellij/psi/PsiPolyVariantReferenceBase.java @@ -41,4 +41,15 @@ public abstract class PsiPolyVariantReferenceBase extends ResolveResult[] resolveResults = multiResolve(false); return resolveResults.length == 1 ? resolveResults[0].getElement() : null; } + + @Override + public boolean isReferenceTo(PsiElement element) { + final ResolveResult[] results = multiResolve(false); + for (ResolveResult result : results) { + if (getElement().getManager().areElementsEquivalent(result.getElement(), element)) { + return true; + } + } + return false; + } } From 64ba6e6ad29c900a97275bd9fc04bc55daef9670 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 5 May 2010 16:43:01 +0400 Subject: [PATCH 04/11] cleanup --- .../psi/impl/PsiDocumentManagerImpl.java | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java index a4c463c9b29d..b2151518a7b1 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/PsiDocumentManagerImpl.java @@ -520,29 +520,28 @@ public class PsiDocumentManagerImpl extends PsiDocumentManager implements Projec public void documentChanged(DocumentEvent event) { final Document document = event.getDocument(); final FileViewProvider viewProvider = getCachedViewProvider(document); - if (viewProvider != null) { - if (viewProvider.getVirtualFile().getFileType().isBinary()) return; + if (viewProvider == null) return; + if (viewProvider.getVirtualFile().getFileType().isBinary()) return; - final List files = viewProvider.getAllFiles(); - boolean commitNecessary = false; - for (PsiFile file : files) { - if (file == null || file instanceof PsiFileImpl && ((PsiFileImpl)file).getTreeElement() == null) continue; - final TextBlock textBlock = getTextBlock(document, file); - if (textBlock.isLocked()) continue; + final List files = viewProvider.getAllFiles(); + boolean commitNecessary = false; + for (PsiFile file : files) { + if (file == null || file instanceof PsiFileImpl && ((PsiFileImpl)file).getTreeElement() == null) continue; + final TextBlock textBlock = getTextBlock(document, file); + if (textBlock.isLocked()) continue; - if (mySmartPointerManager != null) { // mock tests - SmartPointerManagerImpl.unfastenBelts(file); - } - - textBlock.documentChanged(event); - assert file instanceof PsiFileImpl : event + "; file="+file+"; allFiles="+files+"; viewProvider="+viewProvider; - myUncommittedDocuments.add(document); - commitNecessary = true; + if (mySmartPointerManager != null) { // mock tests + SmartPointerManagerImpl.unfastenBelts(file); } - if (commitNecessary && ApplicationManager.getApplication().getCurrentWriteAction(ExternalChangeAction.class) != null){ - commitDocument(document); - } + textBlock.documentChanged(event); + assert file instanceof PsiFileImpl : event + "; file="+file+"; allFiles="+files+"; viewProvider="+viewProvider; + myUncommittedDocuments.add(document); + commitNecessary = true; + } + + if (commitNecessary && ApplicationManager.getApplication().getCurrentWriteAction(ExternalChangeAction.class) != null){ + commitDocument(document); } } From 83a88afdd563be0c3a1695c3cc42b8a809486dbe Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 5 May 2010 17:07:18 +0400 Subject: [PATCH 05/11] assertion --- .../intellij/psi/impl/source/resolve/JavaResolveCache.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java index 86a110cef96a..cc16aef88444 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java @@ -98,7 +98,12 @@ public class JavaResolveCache { type = ConcurrencyUtil.cacheOrGet(myCalculatedTypes, expr, type); } if (!type.isValid()) { - LOG.error("Type is invalid: " + type+"; expr: '"+expr+"' is "+(expr.isValid() ? "valid":"invalid")); + if (expr.isValid()) { + LOG.error("Type is invalid: " + type + "; expr: '" + expr + "' is valid"); + } + else { + LOG.error("Expression: '"+expr+"' is invalid, must not be used for getType()"); + } } return type == NULL_TYPE ? null : type; } From bba49317be10ff43ec850590fb2869761e172f07 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 5 May 2010 18:11:40 +0400 Subject: [PATCH 06/11] dumb flag may stick --- .../daemon/impl/analysis/DefaultHighlightVisitor.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/analysis/DefaultHighlightVisitor.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/analysis/DefaultHighlightVisitor.java index 096e013ef036..ffc0a9dcfec9 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/analysis/DefaultHighlightVisitor.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/analysis/DefaultHighlightVisitor.java @@ -58,12 +58,10 @@ public class DefaultHighlightVisitor implements HighlightVisitor, DumbAware { public static final ExtensionPointName FILTER_EP_NAME = ExtensionPointName.create("com.intellij.highlightErrorFilter"); private final HighlightErrorFilter[] myErrorFilters; private final Project myProject; - private final boolean myDumb; public DefaultHighlightVisitor(Project project) { myProject = project; myErrorFilters = Extensions.getExtensions(FILTER_EP_NAME, project); - myDumb = DumbService.getInstance(myProject).isDumb(); } public boolean suitableForFile(final PsiFile file) { @@ -122,10 +120,11 @@ public class DefaultHighlightVisitor implements HighlightVisitor, DumbAware { private void runAnnotators(final PsiElement element, HighlightInfoHolder holder, final AnnotationHolderImpl annotationHolder) { List annotators = cachedAnnotators.get(element.getLanguage()); if (annotators.isEmpty()) return; + final boolean dumb = DumbService.getInstance(myProject).isDumb(); JobUtil.invokeConcurrentlyUnderMyProgress(annotators, new Processor() { public boolean process(Annotator annotator) { - if (myDumb && !(annotator instanceof DumbAware)) { + if (dumb && !(annotator instanceof DumbAware)) { return true; } From 29b396c4db42dc546395686e31815801623f18fb Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 6 May 2010 14:15:47 +0400 Subject: [PATCH 07/11] since myIcon now always is not null (DeferrredIcon), paint read-write icon always --- .../ReadWriteAccessUsageInfo2UsageAdapter.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/platform/usageView/src/com/intellij/usages/ReadWriteAccessUsageInfo2UsageAdapter.java b/platform/usageView/src/com/intellij/usages/ReadWriteAccessUsageInfo2UsageAdapter.java index d06cf453615d..43770e1d0922 100644 --- a/platform/usageView/src/com/intellij/usages/ReadWriteAccessUsageInfo2UsageAdapter.java +++ b/platform/usageView/src/com/intellij/usages/ReadWriteAccessUsageInfo2UsageAdapter.java @@ -30,16 +30,14 @@ public class ReadWriteAccessUsageInfo2UsageAdapter extends UsageInfo2UsageAdapte super(usageInfo); myAccessedForReading = accessedForReading; myAccessedForWriting = accessedForWriting; - if (myIcon == null) { - if (myAccessedForReading && myAccessedForWriting) { - myIcon = Icons.VARIABLE_RW_ACCESS; - } - else if (myAccessedForWriting) { - myIcon = Icons.VARIABLE_WRITE_ACCESS; // If icon is changed, don't forget to change UTCompositeUsageNode.getIcon(); - } - else if (myAccessedForReading){ - myIcon = Icons.VARIABLE_READ_ACCESS; // If icon is changed, don't forget to change UTCompositeUsageNode.getIcon(); - } + if (myAccessedForReading && myAccessedForWriting) { + myIcon = Icons.VARIABLE_RW_ACCESS; + } + else if (myAccessedForWriting) { + myIcon = Icons.VARIABLE_WRITE_ACCESS; // If icon is changed, don't forget to change UTCompositeUsageNode.getIcon(); + } + else if (myAccessedForReading){ + myIcon = Icons.VARIABLE_READ_ACCESS; // If icon is changed, don't forget to change UTCompositeUsageNode.getIcon(); } } From 04ee1b23f0a0c8a7e44add1202937925b76925b2 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 6 May 2010 15:52:38 +0400 Subject: [PATCH 08/11] http://ea.jetbrains.com/browser/ea_problems/18743 --- .../daemon/impl/quickfix/CreateMethodFromUsageFix.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java index bc3a15c092e4..b418627e735e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateMethodFromUsageFix.java @@ -59,7 +59,7 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { protected boolean isAvailableImpl(int offset) { final PsiMethodCallExpression call = getMethodCall(); - if (call == null) return false; + if (call == null || !call.isValid()) return false; PsiReferenceExpression ref = call.getMethodExpression(); String name = ref.getReferenceName(); @@ -90,8 +90,8 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { PsiExpressionList argumentList = call.getArgumentList(); List errorsInArgList = DaemonCodeAnalyzerImpl.getHighlights(document, HighlightSeverity.ERROR, project, - //strictly inside arg list - argumentList.getTextRange().getStartOffset()+1, + //strictly inside arg list + argumentList.getTextRange().getStartOffset()+1, argumentList.getTextRange().getEndOffset()-1); return !errorsInArgList.isEmpty(); } @@ -117,7 +117,6 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { } protected void invokeImpl(final PsiClass targetClass) { - if (targetClass == null) return; PsiMethodCallExpression expression = getMethodCall(); if (expression == null) return; @@ -170,6 +169,9 @@ public class CreateMethodFromUsageFix extends CreateFromUsageBaseFix { setupVisibility(parentClass, targetClass, method.getModifierList()); + expression = getMethodCall(); + LOG.assertTrue(expression.isValid()); + if (shouldCreateStaticMember(expression.getMethodExpression(), targetClass) && !shouldBeAbstract(targetClass)) { PsiUtil.setModifierProperty(method, PsiModifier.STATIC, true); } From d052e9411734edadd332a04ccb4c02fb2db28bed Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 6 May 2010 16:06:40 +0400 Subject: [PATCH 09/11] cleanup --- .../codeInspection/ProblemsHolder.java | 4 +++ .../src/com/intellij/psi/WalkingState.java | 8 ++--- .../daemon/impl/DaemonTooltipUtil.java | 4 +-- .../daemon/impl/ErrorStripeHandler.java | 13 ++------- .../WholeFileLocalInspectionsPassFactory.java | 4 +-- .../openapi/command/impl/UndoManagerImpl.java | 5 ++++ .../openapi/editor/impl/FoldRegionImpl.java | 2 +- .../inline/GroovyMethodInliner.java | 29 ++++++++++--------- 8 files changed, 36 insertions(+), 33 deletions(-) diff --git a/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java b/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java index ba1705c8497e..c01d4dba74c8 100644 --- a/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java +++ b/platform/lang-api/src/com/intellij/codeInspection/ProblemsHolder.java @@ -179,6 +179,10 @@ public class ProblemsHolder { return myOnTheFly; } + public PsiFile getFile() { + return myFile; + } + public final Project getProject() { return myManager.getProject(); } diff --git a/platform/lang-api/src/com/intellij/psi/WalkingState.java b/platform/lang-api/src/com/intellij/psi/WalkingState.java index d6ac55d5daad..5270d355219c 100644 --- a/platform/lang-api/src/com/intellij/psi/WalkingState.java +++ b/platform/lang-api/src/com/intellij/psi/WalkingState.java @@ -21,7 +21,7 @@ import org.jetbrains.annotations.NotNull; /** * @author cdr */ -public abstract class WalkingState { +public class WalkingState { public interface TreeGuide { T getNextSibling(@NotNull T element); T getPrevSibling(@NotNull T element); @@ -33,9 +33,9 @@ public abstract class WalkingState { private final TreeGuide myWalker; private boolean stopped; - public abstract void elementFinished(@NotNull T element); + public void elementFinished(@NotNull T element) {} - protected WalkingState(@NotNull TreeGuide delegate) { + public WalkingState(@NotNull TreeGuide delegate) { myWalker = delegate; } @@ -100,4 +100,4 @@ public abstract class WalkingState { public void stopWalking() { stopped = true; } -} \ No newline at end of file +} diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipUtil.java index a5e5000b4e7c..3424b514a620 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipUtil.java @@ -41,8 +41,8 @@ public class DaemonTooltipUtil { public static void showInfoTooltip(@NotNull final HighlightInfo info, final Editor editor, final int defaultOffset, final int currentWidth) { if (info.toolTip == null) return; Rectangle visibleArea = editor.getScrollingModel().getVisibleArea(); - int endOffset = info.highlighter.getEndOffset(); - int startOffset = info.highlighter.getStartOffset(); + int startOffset = info.getActualStartOffset(); + int endOffset = info.getActualEndOffset(); Point top = editor.logicalPositionToXY(editor.offsetToLogicalPosition(startOffset)); Point bottom = editor.logicalPositionToXY(editor.offsetToLogicalPosition(endOffset)); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/ErrorStripeHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/ErrorStripeHandler.java index 0618614e2273..a40325f6d283 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/ErrorStripeHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/ErrorStripeHandler.java @@ -21,8 +21,6 @@ import com.intellij.openapi.editor.ex.ErrorStripeEvent; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.project.Project; -import java.util.List; - public class ErrorStripeHandler extends ErrorStripeAdapter { private final Project myProject; @@ -39,14 +37,9 @@ public class ErrorStripeHandler extends ErrorStripeAdapter { } } - private HighlightInfo findInfo(RangeHighlighter highlighter) { - List highlights = DaemonCodeAnalyzerImpl.getHighlights(highlighter.getDocument(), myProject); - if (highlights == null) return null; - for (HighlightInfo info : highlights) { - if (info.highlighter == highlighter) { - return info; - } - } + private static HighlightInfo findInfo(final RangeHighlighter highlighter) { + Object o = highlighter.getErrorStripeTooltip(); + if (o instanceof HighlightInfo) return (HighlightInfo)o; return null; } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/WholeFileLocalInspectionsPassFactory.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/WholeFileLocalInspectionsPassFactory.java index 9541cf9a1c84..cbfdac182a4e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/WholeFileLocalInspectionsPassFactory.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/WholeFileLocalInspectionsPassFactory.java @@ -22,12 +22,12 @@ import com.intellij.codeHighlighting.TextEditorHighlightingPassFactory; import com.intellij.codeHighlighting.TextEditorHighlightingPassRegistrar; import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.ex.InspectionProfileWrapper; +import com.intellij.openapi.Disposable; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.Disposable; import com.intellij.profile.Profile; import com.intellij.profile.ProfileChangeAdapter; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; @@ -106,4 +106,4 @@ public class WholeFileLocalInspectionsPassFactory extends AbstractProjectCompone }; } -} \ No newline at end of file +} diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java index 5c8b9c623c4b..30b3a1af1345 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/UndoManagerImpl.java @@ -253,6 +253,11 @@ public class UndoManagerImpl extends UndoManager implements ProjectComponent, Ap clearUndoRedoQueue(DocumentReferenceManager.getInstance().create(file)); } + @TestOnly + public void clearUndoRedoQueueInTests(Document document) { + clearUndoRedoQueue(DocumentReferenceManager.getInstance().create(document)); + } + protected void compact() { if (myCurrentOperationState == NONE && myCommandTimestamp % COMMAND_TO_RUN_COMPACT == 0) { doCompact(); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldRegionImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldRegionImpl.java index 4c57b9115f8f..1dbf86ed25cd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldRegionImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldRegionImpl.java @@ -70,7 +70,7 @@ public class FoldRegionImpl extends RangeMarkerImpl implements FoldRegion { } public boolean isValid() { - return super.isValid() && getStartOffset() + 1 < getEndOffset(); + return super.isValid() && myStart + 1 < myEnd; } public void setExpandedInternal(boolean toExpand) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java index 6b14a975f408..4b73e716dfe0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/inline/GroovyMethodInliner.java @@ -21,8 +21,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.RangeMarker; -import com.intellij.openapi.editor.ex.DocumentEx; -import com.intellij.openapi.editor.impl.PersistentRangeMarker; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; @@ -58,7 +56,10 @@ import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringBundle; import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil; import org.jetbrains.plugins.groovy.refactoring.NameValidator; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; /** * @author ilyas @@ -85,10 +86,10 @@ public class GroovyMethodInliner implements InlineHandler.Inliner { Map conflicts = new HashMap(); for (GroovyInlineMethodUtil.ReferenceExpressionInfo info : infos) { - if (!(PsiUtil.isAccessible(call, info.declaration))) { + if (!PsiUtil.isAccessible(call, info.declaration)) { if (info.declaration instanceof PsiMethod) { String className = info.containingClass.getName(); - String signature = GroovyRefactoringUtil.getMethodSignature(((PsiMethod) info.declaration)); + String signature = GroovyRefactoringUtil.getMethodSignature((PsiMethod) info.declaration); String name = CommonRefactoringUtil.htmlEmphasize(className + "." + signature); conflicts.put(info.declaration, GroovyRefactoringBundle.message("method.is.not.accessible.form.context.0", name)); } else if (info.declaration instanceof PsiField) { @@ -147,9 +148,9 @@ public class GroovyMethodInliner implements InlineHandler.Inliner { qualifier = ((GrParenthesizedExpression) qualifier).getOperand(); } qualifierDeclaration = factory.createVariableDeclaration(ArrayUtil.EMPTY_STRING_ARRAY, qualifier, null, qualName); - innerQualifier = ((GrReferenceExpression) factory.createExpressionFromText(qualName)); + innerQualifier = (GrReferenceExpression) factory.createExpressionFromText(qualName); } else { - innerQualifier = ((GrReferenceExpression) qualifier); + innerQualifier = (GrReferenceExpression) qualifier; } } } @@ -159,7 +160,7 @@ public class GroovyMethodInliner implements InlineHandler.Inliner { if (result != null) { GrExpression expression = call.replaceWithExpression(result, false); TextRange range = expression.getTextRange(); - return editor != null ? new PersistentRangeMarker((DocumentEx)editor.getDocument(), range.getStartOffset(), range.getEndOffset()) : null; + return editor != null ? editor.getDocument().createRangeMarker(range.getStartOffset(), range.getEndOffset(), true) : null; } String resultName = InlineMethodConflictSolver.suggestNewName("result", newMethod, call); @@ -245,13 +246,13 @@ public class GroovyMethodInliner implements InlineHandler.Inliner { assert replaced != null; TextRange range = replaced.getTextRange(); - RangeMarker marker = editor != null ? new PersistentRangeMarker((DocumentEx)editor.getDocument(), range.getStartOffset(), range.getEndOffset()) : null; + RangeMarker marker = editor != null ? editor.getDocument().createRangeMarker(range.getStartOffset(), range.getEndOffset(), true) : null; reformatOwner(owner); return marker; } else { GrStatement stmt; if (isTailMethodCall && enclosingExpr.getParent() instanceof GrReturnStatement) { - stmt = ((GrReturnStatement) enclosingExpr.getParent()); + stmt = (GrReturnStatement) enclosingExpr.getParent(); } else { stmt = enclosingExpr; } @@ -332,7 +333,7 @@ public class GroovyMethodInliner implements InlineHandler.Inliner { if (statement instanceof GrReturnStatement) { expr = ((GrReturnStatement) statement).getReturnValue(); } else { - expr = ((GrExpression) statement); + expr = (GrExpression) statement; } return expr; } @@ -382,7 +383,7 @@ public class GroovyMethodInliner implements InlineHandler.Inliner { if (element == null) return; for (PsiElement child : element.getChildren()) { if (child instanceof GrVariable && !(child instanceof GrParameter)) { - defintions.add(((GrVariable) child)); + defintions.add((GrVariable) child); } if (!(child instanceof GrClosableBlock)) { collectInnerDefinitions(child, defintions); @@ -401,10 +402,10 @@ public class GroovyMethodInliner implements InlineHandler.Inliner { assert body != null; GrStatement[] statements = body.getStatements(); if (statements.length == 1) { - if (statements[0] instanceof GrExpression) return ((GrExpression) statements[0]); + if (statements[0] instanceof GrExpression) return (GrExpression) statements[0]; if (statements[0] instanceof GrReturnStatement) { GrExpression value = ((GrReturnStatement) statements[0]).getReturnValue(); - if (value == null && (PsiUtil.getSmartReturnType(method) != PsiType.VOID)) { + if (value == null && PsiUtil.getSmartReturnType(method) != PsiType.VOID) { return GroovyPsiElementFactory.getInstance(method.getProject()).createExpressionFromText("null"); } return value; From e2d13b009a3f04daaaa0b1e43421578794fc4b63 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 7 May 2010 14:29:44 +0400 Subject: [PATCH 10/11] junit: cancel progress if exceptions on startup occur testng: -||-; connect to server socket on cancel --- .../intellij/execution/junit/TestPackage.java | 21 +++++++++- .../configuration/TestNGRunnableState.java | 41 ++++++++++++++++--- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java index e500df20e125..d56a1242fdc1 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java @@ -21,6 +21,7 @@ import com.intellij.execution.configurations.ConfigurationPerRunnerSettings; import com.intellij.execution.configurations.RunnerSettings; import com.intellij.execution.configurations.RuntimeConfigurationException; import com.intellij.execution.configurations.RuntimeConfigurationWarning; +import com.intellij.execution.runners.ProgramRunner; import com.intellij.execution.testframework.SourceScope; import com.intellij.execution.testframework.TestSearchScope; import com.intellij.openapi.application.ApplicationManager; @@ -49,6 +50,8 @@ import java.net.Socket; import java.util.Collection; public class TestPackage extends TestObject { + private static BackgroundableProcessIndicator mySearchForTestsIndicator; + public TestPackage(final Project project, final JUnitConfiguration configuration, RunnerSettings runnerSettings, @@ -62,6 +65,19 @@ public class TestPackage extends TestObject { return data.getScope().getSourceScope(myConfiguration); } + @Override + public ExecutionResult execute(Executor executor, @NotNull ProgramRunner runner) throws ExecutionException { + try { + return super.execute(executor, runner); + } + catch (ExecutionException e) { + if (mySearchForTestsIndicator != null && !mySearchForTestsIndicator.isCanceled()) { + mySearchForTestsIndicator.cancel(); //ensure that search for tests stops anyway + } + throw e; + } + } + protected void initialize() throws ExecutionException { super.initialize(); final Project project = myConfiguration.getProject(); @@ -244,7 +260,7 @@ public class TestPackage extends TestObject { } } }; - ProgressManagerImpl.runProcessWithProgressAsynchronously(task, new BackgroundableProcessIndicator(task) { + mySearchForTestsIndicator = new BackgroundableProcessIndicator(task) { @Override public void cancel() { try {//ensure that serverSocket.accept was interrupted @@ -257,7 +273,8 @@ public class TestPackage extends TestObject { } super.cancel(); } - }); + }; + ProgressManagerImpl.runProcessWithProgressAsynchronously(task, mySearchForTestsIndicator); } private static boolean isSyncSearch() { diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java index 70fed049fd9a..9f0c3d7b6db4 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGRunnableState.java @@ -41,7 +41,8 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.LanguageLevelUtil; import com.intellij.openapi.module.Module; -import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator; +import com.intellij.openapi.progress.impl.ProgressManagerImpl; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.ex.JavaSdkUtil; @@ -59,7 +60,10 @@ import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.pom.java.LanguageLevel; import com.intellij.util.PathUtil; import com.intellij.util.net.NetUtils; -import com.theoryinpractice.testng.model.*; +import com.theoryinpractice.testng.model.IDEARemoteTestRunnerClient; +import com.theoryinpractice.testng.model.TestData; +import com.theoryinpractice.testng.model.TestNGRemoteListener; +import com.theoryinpractice.testng.model.TestType; import com.theoryinpractice.testng.ui.TestNGConsoleView; import com.theoryinpractice.testng.ui.TestNGResults; import com.theoryinpractice.testng.ui.actions.RerunFailedTestsAction; @@ -72,9 +76,11 @@ import org.testng.annotations.AfterClass; import org.testng.remote.strprotocol.MessageHelper; import javax.swing.*; -import java.io.*; +import java.io.File; +import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; +import java.net.Socket; import java.net.UnknownHostException; public class TestNGRunnableState extends JavaCommandLineState { @@ -86,6 +92,7 @@ public class TestNGRunnableState extends JavaCommandLineState { private int port; private String debugPort; private File myTempFile; + private BackgroundableProcessIndicator mySearchForTestIndicator; public TestNGRunnableState(ExecutionEnvironment environment, TestNGConfiguration config) { super(environment); @@ -114,9 +121,18 @@ public class TestNGRunnableState extends JavaCommandLineState { @Override public ExecutionResult execute(@NotNull final Executor executor, @NotNull final ProgramRunner runner) throws ExecutionException { + OSProcessHandler processHandler = null; + try { + processHandler = startProcess(); + } + catch (ExecutionException e) { + if (mySearchForTestIndicator != null && !mySearchForTestIndicator.isCanceled()) { + mySearchForTestIndicator.cancel(); + } + throw e; + } final TestNGConsoleView console = new TestNGConsoleView(config, runnerSettings, myConfigurationPerRunnerSettings); console.initUI(); - OSProcessHandler processHandler = startProcess(); for (RunConfigurationExtension ext : Extensions.getExtensions(RunConfigurationExtension.EP_NAME)) { ext.handleStartProcess(config, processHandler); } @@ -306,7 +322,22 @@ public class TestNGRunnableState extends JavaCommandLineState { myTempFile = File.createTempFile("idea_testng", ".tmp"); myTempFile.deleteOnExit(); javaParameters.getProgramParametersList().add("-temp", myTempFile.getAbsolutePath()); - ProgressManager.getInstance().run(new SearchingForTestsTask(serverSocket, is15, config, myTempFile)); + final SearchingForTestsTask task = new SearchingForTestsTask(serverSocket, is15, config, myTempFile); + mySearchForTestIndicator = new BackgroundableProcessIndicator(task) { + @Override + public void cancel() { + try {//ensure that serverSocket.accept was interrupted + if (!serverSocket.isClosed()) { + new Socket(InetAddress.getLocalHost(), serverSocket.getLocalPort()); + } + } + catch (Throwable e) { + LOG.info(e); + } + super.cancel(); + } + }; + ProgressManagerImpl.runProcessWithProgressAsynchronously(task, mySearchForTestIndicator); } catch (IOException e) { LOG.error(e); From 688e7ffc27b3905edd82bbcc6421152b5e74d921 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 7 May 2010 15:52:52 +0400 Subject: [PATCH 11/11] encapsulate fields --- .../codeInsight/template/zencoding/NumberToken.java | 6 +++++- .../codeInsight/template/zencoding/OperationToken.java | 6 +++++- .../codeInsight/template/zencoding/TemplateToken.java | 10 +++++++++- .../template/zencoding/XmlZenCodingInterpreter.java | 8 ++++---- .../template/zencoding/XmlZenCodingTemplate.java | 2 +- .../template/zencoding/ZenCodingTemplate.java | 4 ++-- 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/NumberToken.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/NumberToken.java index 4adf4f763c59..d101c8f4325f 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/NumberToken.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/NumberToken.java @@ -19,9 +19,13 @@ package com.intellij.codeInsight.template.zencoding; * @author Eugene.Kudelevsky */ class NumberToken extends Token { - final int myNumber; + private final int myNumber; NumberToken(int number) { myNumber = number; } + + public int getNumber() { + return myNumber; + } } diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/OperationToken.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/OperationToken.java index 63bb2d343e6c..b33e164eee8e 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/OperationToken.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/OperationToken.java @@ -19,9 +19,13 @@ package com.intellij.codeInsight.template.zencoding; * @author Eugene.Kudelevsky */ class OperationToken extends Token { - final char mySign; + private final char mySign; OperationToken(char sign) { mySign = sign; } + + public char getSign() { + return mySign; + } } diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/TemplateToken.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/TemplateToken.java index 565e8d1114aa..2092f955801c 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/TemplateToken.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/TemplateToken.java @@ -28,7 +28,7 @@ public class TemplateToken extends Token { private final String myKey; private final List> myAttribute2Value; private TemplateImpl myTemplate; - public XmlTag myTag; + private XmlTag myTag; public TemplateToken(String key, List> attribute2value) { myKey = key; @@ -50,4 +50,12 @@ public class TemplateToken extends Token { public TemplateImpl getTemplate() { return myTemplate; } + + public XmlTag getTag() { + return myTag; + } + + public void setTag(XmlTag tag) { + myTag = tag; + } } diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java index 826b83e747a3..45822cbe0f6f 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingInterpreter.java @@ -118,7 +118,7 @@ class XmlZenCodingInterpreter { case OPERATION: if (templateToken != null) { if (token instanceof MarkerToken || token instanceof OperationToken) { - final char sign = token instanceof OperationToken ? ((OperationToken)token).mySign : ZenCodingTemplate.MARKER; + final char sign = token instanceof OperationToken ? ((OperationToken)token).getSign() : ZenCodingTemplate.MARKER; if (sign == '+' || (mySurroundedText == null && sign == ZenCodingTemplate.MARKER)) { final Object key = new Object(); myCallback.fixStartOfTemplate(key); @@ -156,7 +156,7 @@ class XmlZenCodingInterpreter { break; case NUMBER: if (token instanceof NumberToken) { - number = ((NumberToken)token).myNumber; + number = ((NumberToken)token).getNumber(); myState = State.AFTER_NUMBER; } else { @@ -165,7 +165,7 @@ class XmlZenCodingInterpreter { break; case AFTER_NUMBER: if (token instanceof MarkerToken || token instanceof OperationToken) { - char sign = token instanceof OperationToken ? ((OperationToken)token).mySign : ZenCodingTemplate.MARKER; + char sign = token instanceof OperationToken ? ((OperationToken)token).getSign() : ZenCodingTemplate.MARKER; if (sign == '+' || (mySurroundedText == null && sign == ZenCodingTemplate.MARKER)) { invokeTemplateSeveralTimes(templateToken, 0, number); templateToken = null; @@ -310,7 +310,7 @@ class XmlZenCodingInterpreter { if (token.getTemplate() != null) { if (attr2value.size() > 0 || XmlZenCodingTemplate.isTrueXml(callback)) { TemplateImpl modifiedTemplate = token.getTemplate().copy(); - XmlTag tag = token.myTag; + XmlTag tag = token.getTag(); if (tag != null) { for (Iterator> iterator = attr2value.iterator(); iterator.hasNext();) { Pair pair = iterator.next(); diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java index bf34318856a1..9d4613080d16 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/XmlZenCodingTemplate.java @@ -208,7 +208,7 @@ public class XmlZenCodingTemplate extends ZenCodingTemplate { if (!XmlZenCodingInterpreter.containsAttrsVar(template) && token.getAttribute2Value().size() > 0) { addMissingAttributes(tag, token.getAttribute2Value()); } - token.myTag = tag; + token.setTag(tag); } return token; } diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java index 7059e37af21c..cb9a70bc117c 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java @@ -96,7 +96,7 @@ public abstract class ZenCodingTemplate implements CustomLiveTemplate { switch (state) { case OPERATION: if (token instanceof OperationToken) { - state = ((OperationToken)token).mySign == '*' ? State.NUMBER : State.WORD; + state = ((OperationToken)token).getSign() == '*' ? State.NUMBER : State.WORD; } else { return false; @@ -119,7 +119,7 @@ public abstract class ZenCodingTemplate implements CustomLiveTemplate { } break; case AFTER_NUMBER: - if (token instanceof OperationToken && ((OperationToken)token).mySign != '*') { + if (token instanceof OperationToken && ((OperationToken)token).getSign() != '*') { state = State.WORD; } else {