From bb1a41be342530d6e98954f290f2399063046c31 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Mon, 30 Dec 2013 16:23:03 +0400 Subject: [PATCH 01/11] Gradle: fix creation/sync of gradle wrapper files on project import (cherry picked from commit e8c50fa) --- .../gradle/service/project/GradleExecutionHelper.java | 10 ++++++---- .../plugins/gradle/service/task/GradleTaskManager.java | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java index 53404bffa828..8e6df173dc0c 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java @@ -45,7 +45,6 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Field; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -204,9 +203,12 @@ public class GradleExecutionHelper { @NotNull GradleExecutionSettings settings, @NotNull ExternalSystemTaskNotificationListener listener) { - // use it only for customized wrapper - // TODO works correctly only or root project - if (settings.getDistributionType() != DistributionType.WRAPPED) return; + if (!settings.getDistributionType().isWrapped()) return; + + if (settings.getDistributionType() == DistributionType.DEFAULT_WRAPPED && + GradleUtil.findDefaultWrapperPropertiesFile(projectPath) != null) { + return; + } ProjectConnection connection = getConnection(projectPath, settings); try { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java index da9d4a0fce0e..fdea7aecf0f9 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/task/GradleTaskManager.java @@ -73,9 +73,9 @@ public class GradleTaskManager extends AbstractExternalSystemTaskManager Date: Mon, 30 Dec 2013 16:37:14 +0400 Subject: [PATCH 02/11] IDEA-118521 Latest 13.0.1 keeps locking up. Editor becomes unresponsive. Various file types. Using XmlPropertiesIndex to avoid getting xml file content --- .../properties/xml/XmlPropertiesFile.java | 12 ++-------- .../properties/xml/XmlPropertiesIndex.java | 24 +++++++++++++++++-- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/plugins/properties/src/com/intellij/lang/properties/xml/XmlPropertiesFile.java b/plugins/properties/src/com/intellij/lang/properties/xml/XmlPropertiesFile.java index efd5b47d7626..aeb607d89cb0 100644 --- a/plugins/properties/src/com/intellij/lang/properties/xml/XmlPropertiesFile.java +++ b/plugins/properties/src/com/intellij/lang/properties/xml/XmlPropertiesFile.java @@ -32,10 +32,9 @@ import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; -import com.intellij.util.IncorrectOperationException; import com.intellij.reference.SoftLazyValue; +import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.MultiMap; -import com.intellij.util.text.CharArrayUtil; import gnu.trove.THashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -82,14 +81,7 @@ public class XmlPropertiesFile implements PropertiesFile { new CachedValueProvider() { @Override public Result compute() { - CharSequence contents = file.getViewProvider().getContents(); - PropertiesFile value = null; - if (CharArrayUtil.indexOf(contents, XmlPropertiesIndex.HTTP_JAVA_SUN_COM_DTD_PROPERTIES_DTD, 0) != -1 && - XmlPropertiesIndex.isAccepted(contents) - ) { - value = new XmlPropertiesFile(file); - } - + PropertiesFile value = XmlPropertiesIndex.isPropertiesFile(file) ? new XmlPropertiesFile(file) : null; return Result.create(value, file); } }, false); diff --git a/plugins/properties/src/com/intellij/lang/properties/xml/XmlPropertiesIndex.java b/plugins/properties/src/com/intellij/lang/properties/xml/XmlPropertiesIndex.java index 467f656aeb71..6c3b4b1a371c 100644 --- a/plugins/properties/src/com/intellij/lang/properties/xml/XmlPropertiesIndex.java +++ b/plugins/properties/src/com/intellij/lang/properties/xml/XmlPropertiesIndex.java @@ -2,12 +2,18 @@ package com.intellij.lang.properties.xml; import com.intellij.ide.highlighter.XmlFileType; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.project.DumbService; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.io.StreamUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.search.EverythingGlobalScope; +import com.intellij.psi.xml.XmlFile; import com.intellij.util.Consumer; import com.intellij.util.indexing.*; -import com.intellij.util.io.*; +import com.intellij.util.io.DataExternalizer; +import com.intellij.util.io.EnumeratorStringDescriptor; +import com.intellij.util.io.IOUtil; +import com.intellij.util.io.KeyDescriptor; import com.intellij.util.text.CharArrayUtil; import com.intellij.util.xml.NanoXmlUtil; import net.n3.nanoxml.StdXMLReader; @@ -31,7 +37,7 @@ public class XmlPropertiesIndex extends FileBasedIndexExtension NAME = ID.create("xmlProperties"); private static final EnumeratorStringDescriptor ENUMERATOR_STRING_DESCRIPTOR = new EnumeratorStringDescriptor(); - public static final String HTTP_JAVA_SUN_COM_DTD_PROPERTIES_DTD = "http://java.sun.com/dtd/properties.dtd"; + private static final String HTTP_JAVA_SUN_COM_DTD_PROPERTIES_DTD = "http://java.sun.com/dtd/properties.dtd"; @NotNull @Override @@ -94,6 +100,20 @@ public class XmlPropertiesIndex extends FileBasedIndexExtension() { + @Override + public boolean process(VirtualFile file, String value) { + return false; + } + }, new EverythingGlobalScope()); + } + static boolean isAccepted(CharSequence bytes) { MyIXMLBuilderAdapter builder = parse(bytes, true); return builder != null && builder.accepted; From c8bb6fd0f0609f74a92cb9a436c5418675070c9b Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 30 Dec 2013 14:56:00 +0100 Subject: [PATCH 03/11] continue WEB-10360 Javascript debugger with non unique file names --- platform/platform-impl/src/com/intellij/util/Urls.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/util/Urls.java b/platform/platform-impl/src/com/intellij/util/Urls.java index 6a1ee01f9793..2a7b9c5b76d8 100644 --- a/platform/platform-impl/src/com/intellij/util/Urls.java +++ b/platform/platform-impl/src/com/intellij/util/Urls.java @@ -83,6 +83,10 @@ public final class Urls { @Nullable public static Url parse(@NotNull String url, boolean asLocalIfNoScheme) { + if (url.isEmpty()) { + return null; + } + if (asLocalIfNoScheme && !URLUtil.containsScheme(url)) { // nodejs debug — files only in local filesystem return new LocalFileUrl(url); @@ -101,7 +105,7 @@ public final class Urls { return toUriWithoutParameters(asUrl); } catch (Exception e) { - LOG.info("Can't parse " + url, e); + LOG.info("Cannot parse url " + url, e); return null; } } From c34b26084e89646362a643262c7c9f28da33c980 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Mon, 30 Dec 2013 15:03:00 +0100 Subject: [PATCH 04/11] to get version sort copy of ClsStubBuilderFactory implementation array --- .../intellij/psi/impl/compiled/ClassFileStubBuilder.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java index 917a8784b048..2aaf65fd1e98 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/compiled/ClassFileStubBuilder.java @@ -25,8 +25,7 @@ import com.intellij.psi.stubs.StubElement; import com.intellij.util.cls.ClsFormatException; import com.intellij.util.indexing.FileContent; -import java.util.Arrays; -import java.util.Comparator; +import java.util.*; /** * @author max @@ -73,8 +72,9 @@ public class ClassFileStubBuilder implements BinaryFileStubBuilder { @Override public int getStubVersion() { int version = STUB_VERSION; - final ClsStubBuilderFactory[] factories = Extensions.getExtensions(ClsStubBuilderFactory.EP_NAME); - Arrays.sort(factories, new Comparator() { // stable order + List factories = new ArrayList(Arrays.asList( + Extensions.getExtensions(ClsStubBuilderFactory.EP_NAME))); + Collections.sort(factories, new Comparator() { // stable order in copy @Override public int compare(ClsStubBuilderFactory o1, ClsStubBuilderFactory o2) { return o1.getClass().getName().compareTo(o2.getClass().getName()); From 09efbc2bf3b3fa09ea2c4ba4e85647889bc3eae7 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 30 Dec 2013 18:40:08 +0400 Subject: [PATCH 05/11] IDEA-97775 Backing out of empty watch editor creates blank watch entry --- .../intellij/debugger/ui/impl/MainWatchPanel.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java index 203493817f97..b58d9e604f86 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/MainWatchPanel.java @@ -184,8 +184,13 @@ public class MainWatchPanel extends WatchPanel implements DataProvider { } TextWithImports text = comboBox.getText(); - WatchDebuggerTree.setWatchNodeText(node, text); - comboBox.addRecent(text); + if (!text.isEmpty()) { + WatchDebuggerTree.setWatchNodeText(node, text); + comboBox.addRecent(text); + } + else { + getWatchTree().removeWatch(node); + } try { super.doOKAction(); } @@ -196,6 +201,9 @@ public class MainWatchPanel extends WatchPanel implements DataProvider { public void cancelEditing() { comboBox.setPopupVisible(false); + if (((WatchItemDescriptor)node.getDescriptor()).getEvaluationText().isEmpty()) { + getWatchTree().removeWatch(node); + } try { super.cancelEditing(); From ce43bbc494d6e106048d8a61497a505aa4f4469e Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 30 Dec 2013 15:22:47 +0100 Subject: [PATCH 06/11] continue WEB-10360: Now we use script preprocessor to support source map backed breakpoints (we add debugger keyword) and... in this case we MUST use script tag offset instead of absolute. --- xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java b/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java index adcfba57d616..9a64986e1fd5 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java @@ -606,4 +606,8 @@ public class HtmlUtil { } return false; } + + public static boolean isScriptTag(@NotNull HtmlTag tag) { + return tag.getName().equalsIgnoreCase("script"); + } } From f0b3042f1a454b2d751780986d2c5d9a873ae1eb Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 30 Dec 2013 15:41:51 +0100 Subject: [PATCH 07/11] HtmlUtil.isScriptTag --- .../completion/HtmlCompletionData.java | 22 ++++++++++++++++--- .../editorActions/moveUpDown/XmlMover.java | 8 ++----- .../structureView/HtmlTagTreeElement.java | 3 ++- .../html/HtmlScriptLanguageInjector.java | 2 +- .../xml/util/CheckEmptyTagInspection.java | 3 +-- ...eckValidXmlInScriptBodyInspectionBase.java | 6 ++--- .../impl/source/html/ScriptSupportUtil.java | 8 +++---- .../src/com/intellij/xml/util/HtmlUtil.java | 8 ++++--- 8 files changed, 36 insertions(+), 24 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/completion/HtmlCompletionData.java b/xml/impl/src/com/intellij/codeInsight/completion/HtmlCompletionData.java index dbf7393c57e9..6823d69e3337 100644 --- a/xml/impl/src/com/intellij/codeInsight/completion/HtmlCompletionData.java +++ b/xml/impl/src/com/intellij/codeInsight/completion/HtmlCompletionData.java @@ -25,7 +25,11 @@ import com.intellij.psi.filters.getters.HtmlAttributeValueGetter; import com.intellij.psi.filters.getters.XmlAttributeValueGetter; import com.intellij.psi.filters.position.XmlTokenTypeFilter; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.xml.*; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlTag; +import com.intellij.psi.xml.XmlToken; +import com.intellij.psi.xml.XmlTokenType; +import com.intellij.xml.util.HtmlUtil; import org.jetbrains.annotations.NonNls; /** @@ -36,7 +40,6 @@ public class HtmlCompletionData extends XmlCompletionData { private boolean myCaseInsensitive; private static final @NonNls String JAVASCRIPT_LANGUAGE_ID = "JavaScript"; private static final @NonNls String STYLE_TAG = "style"; - private static final @NonNls String SCRIPT_TAG = "script"; public HtmlCompletionData() { this(true); @@ -46,6 +49,7 @@ public class HtmlCompletionData extends XmlCompletionData { myCaseInsensitive = _caseInsensitive; } + @Override protected ElementFilter createXmlEntityCompletionFilter() { if (isCaseInsensitive()) { return new AndFilter( @@ -77,12 +81,15 @@ public class HtmlCompletionData extends XmlCompletionData { myCaseInsensitive = caseInsensitive; } + @Override protected XmlAttributeValueGetter getAttributeValueGetter() { return new HtmlAttributeValueGetter(!isCaseInsensitive()); } + @Override protected ElementFilter createTagCompletionFilter() { return new ElementFilter() { + @Override public boolean isAcceptable(Object element, PsiElement context) { String name = ((XmlTag)context).getName(); @@ -92,7 +99,7 @@ public class HtmlCompletionData extends XmlCompletionData { } if (equalNames(name, STYLE_TAG) || - equalNames(name,SCRIPT_TAG)) { + equalNames(name, HtmlUtil.SCRIPT_TAG_NAME)) { return false; } @@ -100,33 +107,40 @@ public class HtmlCompletionData extends XmlCompletionData { return true; } + @Override public boolean isClassAcceptable(Class hintClass) { return true; } }; } + @Override protected ElementFilter createAttributeCompletionFilter() { return new ElementFilter() { + @Override public boolean isAcceptable(Object element, PsiElement context) { if (isStyleAttributeContext(context)) return false; return true; } + @Override public boolean isClassAcceptable(Class hintClass) { return true; } }; } + @Override protected ElementFilter createAttributeValueCompletionFilter() { return new ElementFilter() { + @Override public boolean isAcceptable(Object element, PsiElement context) { if (isStyleAttributeContext(context)) return false; if ( isScriptContext((PsiElement)element) ) return false; return true; } + @Override public boolean isClassAcceptable(Class hintClass) { return true; } @@ -151,11 +165,13 @@ public class HtmlCompletionData extends XmlCompletionData { return false; } + @Override public void registerVariant(CompletionVariant variant) { super.registerVariant(variant); if (isCaseInsensitive()) variant.setCaseInsensitive(true); } + @Override public String findPrefix(PsiElement insertedElement, int offset) { String prefix = super.findPrefix(insertedElement, offset); diff --git a/xml/impl/src/com/intellij/codeInsight/editorActions/moveUpDown/XmlMover.java b/xml/impl/src/com/intellij/codeInsight/editorActions/moveUpDown/XmlMover.java index 770ac7a1b868..da385b0112f6 100644 --- a/xml/impl/src/com/intellij/codeInsight/editorActions/moveUpDown/XmlMover.java +++ b/xml/impl/src/com/intellij/codeInsight/editorActions/moveUpDown/XmlMover.java @@ -24,7 +24,6 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiNamedElement; import com.intellij.psi.PsiWhiteSpace; -import com.intellij.psi.html.HtmlTag; import com.intellij.psi.impl.source.xml.TagNameVariantCollector; import com.intellij.psi.impl.source.xml.XmlDocumentImpl; import com.intellij.psi.util.PsiTreeUtil; @@ -34,6 +33,7 @@ import com.intellij.psi.xml.XmlTag; import com.intellij.psi.xml.XmlText; import com.intellij.xml.XmlElementDescriptor; import com.intellij.xml.XmlNSDescriptor; +import com.intellij.xml.util.HtmlUtil; import org.jetbrains.annotations.NotNull; class XmlMover extends LineMover { @@ -62,11 +62,7 @@ class XmlMover extends LineMover { if (checkInjections(movedEndElement, movedStartElement)) return false; XmlTag nearestTag = PsiTreeUtil.getParentOfType(movedStartElement, XmlTag.class); - if (nearestTag != null && - ( "script".equals(nearestTag.getLocalName()) || - (nearestTag instanceof HtmlTag && "script".equalsIgnoreCase(nearestTag.getLocalName())) - ) - ) { + if (nearestTag != null && HtmlUtil.isScriptTag(nearestTag)) { return false; } diff --git a/xml/impl/src/com/intellij/lang/html/structureView/HtmlTagTreeElement.java b/xml/impl/src/com/intellij/lang/html/structureView/HtmlTagTreeElement.java index d3bc34b8d18d..f896146608db 100644 --- a/xml/impl/src/com/intellij/lang/html/structureView/HtmlTagTreeElement.java +++ b/xml/impl/src/com/intellij/lang/html/structureView/HtmlTagTreeElement.java @@ -24,6 +24,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.xml.XmlTag; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; +import com.intellij.xml.util.HtmlUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -69,7 +70,7 @@ class HtmlTagTreeElement extends PsiTreeElementBase implements LocationP return null; } - if (tag.getName().equalsIgnoreCase("img") || tag.getName().equalsIgnoreCase("script")) { + if (tag.getName().equalsIgnoreCase("img") || HtmlUtil.isScriptTag(tag)) { return getPathDescription(tag.getAttributeValue("src")); } else if (tag.getName().equalsIgnoreCase("link")) { diff --git a/xml/impl/src/com/intellij/psi/impl/source/html/HtmlScriptLanguageInjector.java b/xml/impl/src/com/intellij/psi/impl/source/html/HtmlScriptLanguageInjector.java index 23c9cfdac3dd..ccde7d31801a 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/html/HtmlScriptLanguageInjector.java +++ b/xml/impl/src/com/intellij/psi/impl/source/html/HtmlScriptLanguageInjector.java @@ -39,7 +39,7 @@ public class HtmlScriptLanguageInjector implements MultiHostInjector { return; } XmlTag scriptTag = ((XmlText)host).getParentTag(); - if (scriptTag == null || !"script".equalsIgnoreCase(scriptTag.getLocalName())) { + if (scriptTag == null || !HtmlUtil.isScriptTag(scriptTag)) { return; } String mimeType = scriptTag.getAttributeValue("type"); diff --git a/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java b/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java index 7ec5ab415e2b..eb3eac55f9ca 100644 --- a/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java +++ b/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckEmptyTagInspection.java @@ -44,8 +44,7 @@ import java.util.Set; */ public class CheckEmptyTagInspection extends XmlSuppressableInspectionTool { private static final Logger LOG = Logger.getInstance("#com.intellij.xml.util.CheckEmptyTagInspection"); - @NonNls private static final String SCRIPT_TAG_NAME = "script"; - @NonNls private static final Set ourTagsWithEmptyEndsNotAllowed = new THashSet(Arrays.asList(SCRIPT_TAG_NAME, "div", "iframe")); + @NonNls private static final Set ourTagsWithEmptyEndsNotAllowed = new THashSet(Arrays.asList(HtmlUtil.SCRIPT_TAG_NAME, "div", "iframe")); @Override public boolean isEnabledByDefault() { diff --git a/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckValidXmlInScriptBodyInspectionBase.java b/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckValidXmlInScriptBodyInspectionBase.java index 30cb218b7691..bf80b8cb71b6 100644 --- a/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckValidXmlInScriptBodyInspectionBase.java +++ b/xml/xml-analysis-impl/src/com/intellij/xml/util/CheckValidXmlInScriptBodyInspectionBase.java @@ -41,8 +41,6 @@ public class CheckValidXmlInScriptBodyInspectionBase extends XmlSuppressableInsp protected static final String AMP_ENTITY_REFERENCE = "&"; @NonNls protected static final String LT_ENTITY_REFERENCE = "<"; - @NonNls - private static final String SCRIPT_TAG_NAME = "script"; private Lexer myXmlLexer; @Override @@ -57,8 +55,8 @@ public class CheckValidXmlInScriptBodyInspectionBase extends XmlSuppressableInsp @Override public void visitXmlTag(final XmlTag tag) { if (HtmlUtil.isHtmlTag(tag)) return; - if (SCRIPT_TAG_NAME.equals(tag.getName()) || - tag instanceof HtmlTag && SCRIPT_TAG_NAME.equalsIgnoreCase(tag.getName())) { + if (HtmlUtil.SCRIPT_TAG_NAME.equals(tag.getName()) || + tag instanceof HtmlTag && HtmlUtil.SCRIPT_TAG_NAME.equalsIgnoreCase(tag.getName())) { final PsiFile psiFile = tag.getContainingFile(); final FileType fileType = psiFile.getFileType(); diff --git a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/ScriptSupportUtil.java b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/ScriptSupportUtil.java index 2abbb5b9d775..ce5fe4ebfc61 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/ScriptSupportUtil.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/html/ScriptSupportUtil.java @@ -28,8 +28,8 @@ import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.xml.*; import com.intellij.xml.XmlElementDescriptor; import com.intellij.xml.util.HtmlPsiUtil; +import com.intellij.xml.util.HtmlUtil; import com.intellij.xml.util.XmlPsiUtil; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -41,7 +41,6 @@ import java.util.List; public class ScriptSupportUtil { private static final Key> CachedScriptTagsKey = Key.create("script tags"); private static final ThreadLocal ProcessingDeclarationsFlag = new ThreadLocal(); - @NonNls private static final String SCRIPT_TAG = "script"; private ScriptSupportUtil() { } @@ -66,13 +65,14 @@ public class ScriptSupportUtil { if (document != null) { PsiElementProcessor psiElementProcessor = new PsiElementProcessor() { + @Override public boolean execute(@NotNull final PsiElement element) { if (element instanceof XmlTag) { final XmlTag tag = (XmlTag)element; - if (SCRIPT_TAG.equalsIgnoreCase(tag.getName())) { + if (HtmlUtil.SCRIPT_TAG_NAME.equalsIgnoreCase(tag.getName())) { final XmlElementDescriptor descriptor = tag.getDescriptor(); - if (descriptor != null && SCRIPT_TAG.equals(descriptor.getName())) { + if (descriptor != null && HtmlUtil.SCRIPT_TAG_NAME.equals(descriptor.getName())) { scriptTags.add(tag); } } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java b/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java index 9a64986e1fd5..7923801c3e36 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/util/HtmlUtil.java @@ -70,6 +70,8 @@ public class HtmlUtil { @NonNls private static final String CHARSET_PREFIX = CHARSET+"="; @NonNls private static final String HTML5_DATA_ATTR_PREFIX = "data-"; + public static final String SCRIPT_TAG_NAME = "script"; + public static final String[] CONTENT_TYPES = {"application/activemessage", "application/andrew-inset", "application/applefile", "application/atomicmail", "application/dca-rft", "application/dec-dx", "application/mac-binhex40" @@ -488,7 +490,7 @@ public class HtmlUtil { public void endTag(final CharSequence localName, final String namespace, final int startoffset, final int endoffset) { @NonNls final String name = localName.toString().toLowerCase(); if ("meta".equals(name) && (metHttpEquiv || metHttml5Charset) && contentAttributeValue != null) { - String charsetName = null; + String charsetName; if (metHttpEquiv) { int start = contentAttributeValue.indexOf(CHARSET_PREFIX); if (start == -1) return; @@ -607,7 +609,7 @@ public class HtmlUtil { return false; } - public static boolean isScriptTag(@NotNull HtmlTag tag) { - return tag.getName().equalsIgnoreCase("script"); + public static boolean isScriptTag(@NotNull XmlTag tag) { + return tag.getLocalName().equalsIgnoreCase(SCRIPT_TAG_NAME); } } From 8a387be8a88455c1a7c22b584d69825e18018829 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Sun, 29 Dec 2013 15:11:10 +0600 Subject: [PATCH 08/11] IDEA-97803 Add ignore options to Groovy empty catch block inspection --- .../GroovyInspectionBundle.properties | 4 +- .../GroovyEmptyCatchBlockInspection.java | 44 ++++++++++++++++--- .../lang/highlighting/GrInspectionTest.groovy | 31 +++++++++++++ 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/GroovyInspectionBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/GroovyInspectionBundle.properties index eae16b25f18f..3d658f098b0e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/GroovyInspectionBundle.properties +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/GroovyInspectionBundle.properties @@ -107,4 +107,6 @@ target.0.does.not.exist=Target ''{0}'' does not exist target.annotation.is.unused=@Target is unused change.lvalue.type=Change variable ''{0}'' type to ''{1}'' replace.qualified.name.with.import=Replace qualified name with import -highlight.assignments.from.void=Highlight assignments from void type \ No newline at end of file +highlight.assignments.from.void=Highlight assignments from void type +comments.count.as.content=Comments count as content +ignore.when.catch.parameter.is.named.ignore.or.ignored=Ignore when catch parameter is named ignore or ignored \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/exception/GroovyEmptyCatchBlockInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/exception/GroovyEmptyCatchBlockInspection.java index 231bc9086d79..50ff0bc6bc20 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/exception/GroovyEmptyCatchBlockInspection.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/exception/GroovyEmptyCatchBlockInspection.java @@ -18,16 +18,26 @@ package org.jetbrains.plugins.groovy.codeInspection.exception; import com.intellij.codeInsight.daemon.impl.quickfix.RenameElementFix; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemHighlightType; +import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel; +import com.intellij.psi.PsiComment; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.codeInspection.BaseInspection; import org.jetbrains.plugins.groovy.codeInspection.BaseInspectionVisitor; +import org.jetbrains.plugins.groovy.codeInspection.GroovyInspectionBundle; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrCatchClause; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; + +import javax.swing.*; public class GroovyEmptyCatchBlockInspection extends BaseInspection { + public boolean myIgnore = true; + public boolean myCountCommentsAsContent = true; @Nls @NotNull @@ -41,11 +51,21 @@ public class GroovyEmptyCatchBlockInspection extends BaseInspection { return "Empty 'catch' block"; } + @NotNull public BaseInspectionVisitor buildVisitor() { return new Visitor(); } - private static class Visitor extends BaseInspectionVisitor { + @Nullable + @Override + public JComponent createOptionsPanel() { + MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(GroovyInspectionBundle.message("comments.count.as.content"), "myCountCommentsAsContent"); + panel.addCheckbox(GroovyInspectionBundle.message("ignore.when.catch.parameter.is.named.ignore.or.ignored"), "myIgnore"); + return panel; + } + + private class Visitor extends BaseInspectionVisitor { public void visitCatchClause(GrCatchClause catchClause) { super.visitCatchClause(catchClause); @@ -56,15 +76,29 @@ public class GroovyEmptyCatchBlockInspection extends BaseInspection { final GrParameter parameter = catchClause.getParameter(); if (parameter == null) return; - if (GrExceptionUtil.ignore(parameter)) return; + if (myIgnore && GrExceptionUtil.ignore(parameter)) return; - final LocalQuickFix[] fixes = {new RenameElementFix(parameter, "ignored")}; + final LocalQuickFix[] fixes = myIgnore + ? new RenameElementFix[]{new RenameElementFix(parameter, "ignored")} + : LocalQuickFix.EMPTY_ARRAY; registerError(catchClause.getFirstChild(), "Empty '#ref' block #loc", fixes, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); } - private static boolean isEmpty(@NotNull GrOpenBlock body) { + private boolean isEmpty(@NotNull GrOpenBlock body) { final GrStatement[] statements = body.getStatements(); - return statements.length == 0; + if (statements.length != 0) return false; + + if (myCountCommentsAsContent) { + final PsiElement brace = body.getLBrace(); + if (brace != null) { + final PsiElement next = PsiUtil.skipWhitespaces(brace.getNextSibling(), true); + if (next instanceof PsiComment) { + return false; + } + } + } + + return true; } } } \ No newline at end of file diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GrInspectionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GrInspectionTest.groovy index 9387d0df31a0..2b9ecad11444 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GrInspectionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/highlighting/GrInspectionTest.groovy @@ -23,6 +23,7 @@ import org.jetbrains.plugins.groovy.codeInspection.control.GroovyTrivialIfInspec import org.jetbrains.plugins.groovy.codeInspection.control.GroovyUnnecessaryContinueInspection import org.jetbrains.plugins.groovy.codeInspection.control.GroovyUnnecessaryReturnInspection import org.jetbrains.plugins.groovy.codeInspection.declaration.GrMethodMayBeStaticInspection +import org.jetbrains.plugins.groovy.codeInspection.exception.GroovyEmptyCatchBlockInspection import org.jetbrains.plugins.groovy.codeInspection.metrics.GroovyOverlyLongMethodInspection import org.jetbrains.plugins.groovy.codeInspection.noReturnMethod.MissingReturnInspection import org.jetbrains.plugins.groovy.codeInspection.threading.GroovyUnconditionalWaitInspection @@ -316,4 +317,34 @@ for(i in []) { ''', GroovyUnnecessaryContinueInspection) } + void testEmptyCatchBlock1() { + testHighlighting(''' +try{} catch(IOException e) {} +try{} catch(IOException ignored) {} +try{} catch(IOException ignore) {} +try{} catch(IOException e) {/*comment*/} +''', GroovyEmptyCatchBlockInspection) + } + + void testEmptyCatchBlock2() { + GroovyEmptyCatchBlockInspection inspection = new GroovyEmptyCatchBlockInspection() + inspection.myIgnore = false + myFixture.enableInspections(inspection) + testHighlighting('try{} catch(IOException ignored) {}') + } + + void testEmptyCatchBlock3() { + GroovyEmptyCatchBlockInspection inspection = new GroovyEmptyCatchBlockInspection() + inspection.myIgnore = false + myFixture.enableInspections(inspection) + testHighlighting('try{} catch(IOException ignored) {}') + } + + void testEmptyCatchBlock4() { + GroovyEmptyCatchBlockInspection inspection = new GroovyEmptyCatchBlockInspection() + inspection.myCountCommentsAsContent = false + myFixture.enableInspections(inspection) + testHighlighting('try{} catch(IOException e) {/*comment*/}') + } + } From 4b4ea542c8b809f4766a96b36751018a04a7c788 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Mon, 30 Dec 2013 21:04:44 +0600 Subject: [PATCH 09/11] EA-50513 - assert: ExpressionGenerator.visitExpression --- .../refactoring/convertToJava/ExpressionGenerator.java | 8 ++++++++ .../convertToJava/CodeBlockGenerationTest.groovy | 2 ++ .../convertGroovyToJava/codeBlock/propSelection.groovy | 1 + .../convertGroovyToJava/codeBlock/propSelection.java | 1 + 4 files changed, 12 insertions(+) create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/propSelection.groovy create mode 100644 plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/propSelection.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java index 657f55897281..fb783b922737 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionGenerator.java @@ -55,6 +55,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrString; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrIndexProperty; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrPropertySelection; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrGdkMethod; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; @@ -1270,6 +1271,13 @@ public class ExpressionGenerator extends Generator { builder.append(')'); } + @Override + public void visitPropertySelection(GrPropertySelection expression) { + expression.getQualifier().accept(this); + builder.append('.'); + builder.append(expression.getReferenceNameElement().getText()); + } + @Override public void visitIndexProperty(GrIndexProperty expression) { final GrExpression selectedExpression = expression.getInvokedExpression(); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy index c5d374178da6..f6e52759ee23 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerationTest.groovy @@ -198,4 +198,6 @@ public final class Matcher { void testInWitchClassCheck() { doTest() } void testSwitch() { doTest() } + + void testPropSelection() { doTest() } } diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/propSelection.groovy b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/propSelection.groovy new file mode 100644 index 000000000000..0073667147f4 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/propSelection.groovy @@ -0,0 +1 @@ +print p."a$c" \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/propSelection.java b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/propSelection.java new file mode 100644 index 000000000000..0347871923e2 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/propSelection.java @@ -0,0 +1 @@ +print(this.getBinding().getProperty("p")."a$c"); From 2542ac15d3ed60257dea0c02a77228c10dbd3323 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Mon, 30 Dec 2013 19:09:01 +0400 Subject: [PATCH 10/11] run under read action to ensure dumb mode state --- .../projectView/ResourceBundleGrouper.java | 83 ++++++++++--------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/plugins/properties/src/com/intellij/lang/properties/projectView/ResourceBundleGrouper.java b/plugins/properties/src/com/intellij/lang/properties/projectView/ResourceBundleGrouper.java index 9a3cd7f88738..3394011ab309 100644 --- a/plugins/properties/src/com/intellij/lang/properties/projectView/ResourceBundleGrouper.java +++ b/plugins/properties/src/com/intellij/lang/properties/projectView/ResourceBundleGrouper.java @@ -22,8 +22,10 @@ import com.intellij.lang.properties.PropertiesUtil; import com.intellij.lang.properties.ResourceBundle; import com.intellij.lang.properties.psi.PropertiesFile; import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiFile; import com.intellij.util.SmartList; import gnu.trove.THashMap; @@ -40,49 +42,54 @@ public class ResourceBundleGrouper implements TreeStructureProvider, DumbAware { myProject = project; } - public Collection modify(AbstractTreeNode parent, Collection children, ViewSettings settings) { + public Collection modify(AbstractTreeNode parent, final Collection children, final ViewSettings settings) { if (parent instanceof ResourceBundleNode) return children; - Map> childBundles = new THashMap>(); - for (AbstractTreeNode child : children) { - Object f = child.getValue(); - if (f instanceof PsiFile) { - PropertiesFile propertiesFile = PropertiesUtil.getPropertiesFile((PsiFile)f); - if (propertiesFile != null) { - ResourceBundle bundle = propertiesFile.getResourceBundle(); - Collection files = childBundles.get(bundle); - if (files == null) { - files = new SmartList(); - childBundles.put(bundle, files); - } - files.add(propertiesFile); - } - } - } - - List result = new ArrayList(); - for (Map.Entry> entry : childBundles.entrySet()) { - ResourceBundle resourceBundle = entry.getKey(); - Collection files = entry.getValue(); - if (files.size() != 1) { - result.add(new ResourceBundleNode(myProject, resourceBundle, settings)); - } - } - for (AbstractTreeNode child : children) { - Object f = child.getValue(); - if (f instanceof PsiFile) { - PropertiesFile propertiesFile = PropertiesUtil.getPropertiesFile((PsiFile)f); - if (propertiesFile != null) { - ResourceBundle bundle = propertiesFile.getResourceBundle(); - if (childBundles.get(bundle).size() != 1) { - continue; + return ApplicationManager.getApplication().runReadAction(new Computable>() { + @Override + public Collection compute() { + Map> childBundles = new THashMap>(); + for (AbstractTreeNode child : children) { + Object f = child.getValue(); + if (f instanceof PsiFile) { + PropertiesFile propertiesFile = PropertiesUtil.getPropertiesFile((PsiFile)f); + if (propertiesFile != null) { + ResourceBundle bundle = propertiesFile.getResourceBundle(); + Collection files = childBundles.get(bundle); + if (files == null) { + files = new SmartList(); + childBundles.put(bundle, files); + } + files.add(propertiesFile); + } } } - } - result.add(child); - } - return result; + List result = new ArrayList(); + for (Map.Entry> entry : childBundles.entrySet()) { + ResourceBundle resourceBundle = entry.getKey(); + Collection files = entry.getValue(); + if (files.size() != 1) { + result.add(new ResourceBundleNode(myProject, resourceBundle, settings)); + } + } + for (AbstractTreeNode child : children) { + Object f = child.getValue(); + if (f instanceof PsiFile) { + PropertiesFile propertiesFile = PropertiesUtil.getPropertiesFile((PsiFile)f); + if (propertiesFile != null) { + ResourceBundle bundle = propertiesFile.getResourceBundle(); + if (childBundles.get(bundle).size() != 1) { + continue; + } + } + } + result.add(child); + } + + return result; + } + }); } public Object getData(Collection selected, String dataName) { From 8f76e73bb6abb9c5b46394c0422593f45e6ad5e1 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 30 Dec 2013 16:19:47 +0100 Subject: [PATCH 11/11] IDEA-118743 (False positive "Number of placeholders does not match number of arguments in logging call") --- ...laceholderCountMatchesArgumentCountInspection.java | 8 ++++++++ ...holderCountMatchesArgumentCountInspectionTest.java | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/logging/PlaceholderCountMatchesArgumentCountInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/logging/PlaceholderCountMatchesArgumentCountInspection.java index e98ce28efeb6..660a88f81a4a 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/logging/PlaceholderCountMatchesArgumentCountInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/logging/PlaceholderCountMatchesArgumentCountInspection.java @@ -70,6 +70,14 @@ public class PlaceholderCountMatchesArgumentCountInspection extends BaseInspecti if (!loggingMethodNames.contains(name)) { return; } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (!InheritanceUtil.isInheritor(aClass, "org.slf4j.Logger")) { + return; + } final PsiExpressionList argumentList = expression.getArgumentList(); final PsiExpression[] arguments = argumentList.getExpressions(); if (arguments.length == 0) { diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/logging/PlaceholderCountMatchesArgumentCountInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/logging/PlaceholderCountMatchesArgumentCountInspectionTest.java index 8b69ced5f811..c122583ee586 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/logging/PlaceholderCountMatchesArgumentCountInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/logging/PlaceholderCountMatchesArgumentCountInspectionTest.java @@ -76,4 +76,15 @@ public class PlaceholderCountMatchesArgumentCountInspectionTest extends LightIns " public static class SecondException extends Exception { }\n" + "}"); } + + public void testNoSlf4j() { + doTest("class FalsePositiveSLF4J {\n" + + " public void method( DefinitelyNotSLF4J definitelyNotSLF4J ) {\n" + + " definitelyNotSLF4J.trace( \"not a trace message\", \"not a trace parameter\" );\n" + + " }\n" + + " public interface DefinitelyNotSLF4J {\n" + + " void trace( String firstParameter, Object secondParameter );\n" + + " }\n" + + "}"); + } } \ No newline at end of file