From cbfee298bb349e98014044ce6130c3aa36fc5158 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 31 Oct 2014 14:26:53 +0300 Subject: [PATCH 1/7] SOE fixed --- platform/util/src/com/intellij/util/text/ImmutableText.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/text/ImmutableText.java b/platform/util/src/com/intellij/util/text/ImmutableText.java index b883aeb0a185..b18a8b8306b0 100644 --- a/platform/util/src/com/intellij/util/text/ImmutableText.java +++ b/platform/util/src/com/intellij/util/text/ImmutableText.java @@ -437,7 +437,7 @@ public final class ImmutableText extends ImmutableCharSequence implements CharAr if (start == 0 && end == length()) { return this; } - return createLeafNode(subSequence(start, end)); + return createLeafNode(new CharArrayCharSequence(data, start, end)); } @NotNull From 033af4a1a73f5dc8750f8d4e2be2683d86674831 Mon Sep 17 00:00:00 2001 From: Ilya Klyuchnikov Date: Fri, 31 Oct 2014 14:39:46 +0300 Subject: [PATCH 2/7] javadoc for PatchProjectUtil --- .../intellij/ide/impl/PatchProjectUtil.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/platform/lang-impl/src/com/intellij/ide/impl/PatchProjectUtil.java b/platform/lang-impl/src/com/intellij/ide/impl/PatchProjectUtil.java index 773dbff4ad9a..c27e117f153e 100644 --- a/platform/lang-impl/src/com/intellij/ide/impl/PatchProjectUtil.java +++ b/platform/lang-impl/src/com/intellij/ide/impl/PatchProjectUtil.java @@ -41,10 +41,50 @@ import java.util.Map; import java.util.Set; import java.util.regex.Pattern; +/** + * Utility to patch project model by excluding folders/files from content roots. + * Can be used for running offline inspections (from command-line directly or in teamcity). + * + * The main logic is in the method {@link #patchProject(com.intellij.openapi.project.Project)}. + * + * @see com.intellij.codeInspection.InspectionApplication + */ public class PatchProjectUtil { private PatchProjectUtil() { } + /** + * Excludes folders specified in patterns in the idea.exclude.patterns system property from the project. + * + *

Pattern syntax: + *
+ * + *

+ * + * Where + * + * + * + *

+ * Example:
+ * + * -Didea.exclude.patterns=testData/**;.reports/**;[sql]/test/*.sql;[graph]/**;[graph-openapi]/** + * + *
+ * + * In this example the testData/** pattern is applied to all modules + * and the pattern /test/*.sql to applied to the module sql only. + * + * @param project project to patch + * @see http://ant.apache.org/manual/dirtasks.html + */ public static void patchProject(final Project project) { final Map> excludePatterns = loadPatterns("idea.exclude.patterns"); final Map> includePatterns = loadPatterns("idea.include.patterns"); @@ -138,6 +178,13 @@ public class PatchProjectUtil { }); } + /** + * Parses patterns for exclude items. + * + * @param propertyKey system property key for pattern + * @return A map from ModulePattern -> DirectoryPattern*. + * ModulePattern may be null (meaning that directory pattern is applied to all modules). + */ public static Map> loadPatterns(@NonNls String propertyKey) { final Map> result = new HashMap>(); final String patterns = System.getProperty(propertyKey); From b5da93212da29ffbb584d4a5ce03e11520a741c9 Mon Sep 17 00:00:00 2001 From: Ilya Klyuchnikov Date: Fri, 31 Oct 2014 14:45:53 +0300 Subject: [PATCH 3/7] javadoc cleanup --- .../lang-impl/src/com/intellij/ide/impl/PatchProjectUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/impl/PatchProjectUtil.java b/platform/lang-impl/src/com/intellij/ide/impl/PatchProjectUtil.java index c27e117f153e..6c2be5072224 100644 --- a/platform/lang-impl/src/com/intellij/ide/impl/PatchProjectUtil.java +++ b/platform/lang-impl/src/com/intellij/ide/impl/PatchProjectUtil.java @@ -182,8 +182,8 @@ public class PatchProjectUtil { * Parses patterns for exclude items. * * @param propertyKey system property key for pattern - * @return A map from ModulePattern -> DirectoryPattern*. - * ModulePattern may be null (meaning that directory pattern is applied to all modules). + * @return A map in the form ModulePattern -> DirectoryPattern*. + * ModulePattern may be null (meaning that a directory pattern is applied to all modules). */ public static Map> loadPatterns(@NonNls String propertyKey) { final Map> result = new HashMap>(); From 333ea2d2825c02e34a34b1b9fb5c88ed77577d8c Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 31 Oct 2014 15:19:25 +0300 Subject: [PATCH 4/7] XmlNSDescriptor: always check 'instanceof' before casting to implementation (IDEA-132191) --- .../TypeOrElementOrAttributeReference.java | 11 +++++------ .../impl/schema/XmlElementDescriptorImpl.java | 17 ++++++++++------- .../xml/impl/schema/XmlNSDescriptorImpl.java | 6 +++--- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/TypeOrElementOrAttributeReference.java b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/TypeOrElementOrAttributeReference.java index 47a77fef37a9..89f2a61197c9 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/TypeOrElementOrAttributeReference.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/TypeOrElementOrAttributeReference.java @@ -334,16 +334,16 @@ public class TypeOrElementOrAttributeReference implements PsiReference { final XmlNSDescriptor nsDescriptor = tag.getNSDescriptor(namespace, true); if (nsDescriptor instanceof XmlNSDescriptorImpl) { - processNamespace(namespace, processor, nsDescriptor, tagNames); + processNamespace(namespace, processor, (XmlNSDescriptorImpl)nsDescriptor, tagNames); } } XmlNSDescriptor nsDescriptor = (XmlNSDescriptor)document.getMetaData(); - if (nsDescriptor != null) { + if (nsDescriptor instanceof XmlNSDescriptorImpl) { processNamespace( ourNamespace, processor, - nsDescriptor, + (XmlNSDescriptorImpl)nsDescriptor, tagNames ); } @@ -353,13 +353,12 @@ public class TypeOrElementOrAttributeReference implements PsiReference { private static void processNamespace(final String namespace, final CompletionProcessor processor, - final XmlNSDescriptor nsDescriptor, + final XmlNSDescriptorImpl nsDescriptor, final String[] tagNames) { processor.namespace = namespace; - final XmlNSDescriptorImpl xmlNSDescriptor = ((XmlNSDescriptorImpl)nsDescriptor); XmlNSDescriptorImpl.processTagsInNamespace( - xmlNSDescriptor.getTag(), + nsDescriptor.getTag(), tagNames, processor ); diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java index 49d3c4c12245..6f996852ef8c 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java @@ -117,11 +117,10 @@ public class XmlElementDescriptorImpl extends XsdEnumerationDescriptor public String getNamespace(){ String name = getName(); if (name == null) return XmlUtil.EMPTY_URI; - final XmlNSDescriptorImpl xmlNSDescriptor = (XmlNSDescriptorImpl)getNSDescriptor(); - if (xmlNSDescriptor == null || myDescriptorTag == null) return XmlUtil.EMPTY_URI; + if (getNSDescriptor() == null || myDescriptorTag == null) return XmlUtil.EMPTY_URI; final String namespacePrefix = XmlUtil.findPrefixByQualifiedName(name); return namespacePrefix.isEmpty() ? - xmlNSDescriptor.getDefaultNamespace() : + getDefaultNamespace() : myDescriptorTag.getNamespaceByPrefix(namespacePrefix); } @@ -192,7 +191,7 @@ public class XmlElementDescriptorImpl extends XsdEnumerationDescriptor if (substAttr != null) { final String namespacePrefix = XmlUtil.findPrefixByQualifiedName(substAttr); final String namespace = namespacePrefix.isEmpty() ? - ((XmlNSDescriptorImpl)getNSDescriptor()).getDefaultNamespace() : + getDefaultNamespace() : myDescriptorTag.getNamespaceByPrefix(namespacePrefix); final String local = XmlUtil.findLocalNameByQualifiedName(substAttr); final XmlElementDescriptorImpl originalElement = (XmlElementDescriptorImpl)((XmlNSDescriptorImpl)getNSDescriptor()).getElementDescriptor(local, namespace); @@ -335,9 +334,8 @@ public class XmlElementDescriptorImpl extends XsdEnumerationDescriptor private XmlAttributeDescriptor getAttributeDescriptorImpl(final String attributeName, XmlTag context) { final String localName = XmlUtil.findLocalNameByQualifiedName(attributeName); final String namespacePrefix = XmlUtil.findPrefixByQualifiedName(attributeName); - final XmlNSDescriptorImpl xmlNSDescriptor = (XmlNSDescriptorImpl)getNSDescriptor(); final String namespace = namespacePrefix.isEmpty() ? - ((xmlNSDescriptor != null)?xmlNSDescriptor.getDefaultNamespace():"") : + getDefaultNamespace() : context.getNamespaceByPrefix(namespacePrefix); XmlAttributeDescriptor attribute = getAttribute(localName, namespace, context, attributeName); @@ -364,6 +362,11 @@ public class XmlElementDescriptorImpl extends XsdEnumerationDescriptor return attribute; } + private String getDefaultNamespace() { + XmlNSDescriptor nsDescriptor = getNSDescriptor(); + return nsDescriptor instanceof XmlNSDescriptorImpl ? ((XmlNSDescriptorImpl)nsDescriptor).getDefaultNamespace() : ""; + } + @Override public XmlAttributeDescriptor getAttributeDescriptor(XmlAttribute attribute){ return getAttributeDescriptorImpl(attribute.getName(),attribute.getParent()); @@ -410,7 +413,7 @@ public class XmlElementDescriptorImpl extends XsdEnumerationDescriptor final String localName = XmlUtil.findLocalNameByQualifiedName(name); final String namespacePrefix = XmlUtil.findPrefixByQualifiedName(name); final String namespace = namespacePrefix.isEmpty() ? - ((XmlNSDescriptorImpl)getNSDescriptor()).getDefaultNamespace() : + getDefaultNamespace() : myDescriptorTag.getNamespaceByPrefix(namespacePrefix); return getElementDescriptor(localName, namespace, null, name); } diff --git a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java index 17c6f1ab37ae..820c0a992859 100644 --- a/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/xml/impl/schema/XmlNSDescriptorImpl.java @@ -477,10 +477,10 @@ public class XmlNSDescriptorImpl implements XmlNSDescriptorEx,Validator visited) { if (myTag == null) return null; - XmlNSDescriptorImpl nsDescriptor = (XmlNSDescriptorImpl)myTag.getNSDescriptor(namespace, true); + XmlNSDescriptor nsDescriptor = myTag.getNSDescriptor(namespace, true); - if (nsDescriptor != this && nsDescriptor != null) { - return nsDescriptor.getAttributeImpl( + if (nsDescriptor != this && nsDescriptor instanceof XmlNSDescriptorImpl) { + return ((XmlNSDescriptorImpl)nsDescriptor).getAttributeImpl( localName, namespace, visited From c1284be71db22592b2c03b1af0eb9c283a515687 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Fri, 31 Oct 2014 13:22:19 +0100 Subject: [PATCH 5/7] missing retina icons for action popups --- platform/icons/src/icons/ide/nextStep@2x.png | Bin 0 -> 504 bytes .../icons/src/icons/ide/nextStepGrayed@2x.png | Bin 0 -> 249 bytes .../icons/src/icons/ide/nextStepInverted@2x.png | Bin 0 -> 235 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 platform/icons/src/icons/ide/nextStep@2x.png create mode 100644 platform/icons/src/icons/ide/nextStepGrayed@2x.png create mode 100644 platform/icons/src/icons/ide/nextStepInverted@2x.png diff --git a/platform/icons/src/icons/ide/nextStep@2x.png b/platform/icons/src/icons/ide/nextStep@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8968229a6f5871a3bbc5328d7998eb1b67d900ed GIT binary patch literal 504 zcmVH3*wtkAm4od3HQyZuIN`}_~1XoA0!O&4J#WfFmAXR zgoOCOzG7!*1^R~ZvT4Z@oW5bfCGqF~KcKg~ayig9tgH;Yyi99=@sYi+F6b5MJ^;G@Hx?g2!D~?1FHNyqMJSSSTY%dK zYySQFm%S>@o~UF>N*sV)y*Axp6)71Frv<>G0i2SMUA-~OiR7XJPaJ@gC)m|nvYl3u uTi7w-@xhuufBx!FV)$s4IXEl;2rvNlVr5ryu$9@^U!SN*RSZ z-yX-AGiR#&R^aJa&rqnL+w8&95$?EALiaJllkU?`ezZ;TP&;k@WQo$G8s|JC)m!FM zo-sG=Tj=JN+>&(3NNQpNuRuEUNA0ZN3{!R=Ug-F_Yt5o2q43GCnHR}1{rdmko>|vWn7Q}hhiwU}0^OG`H5n-EV>+^M z3y+eaLLBSSq%A$n6ZG{aKb8(snyGVt!sITGPrN%%PRY0*FpHn#SDTb%uVB|kCNVDF zc;+KF9sYFPva8@d^6 Date: Thu, 30 Oct 2014 20:38:39 +0100 Subject: [PATCH 6/7] new inference: unchecked conversion detection in case of inference variables (IDEA-122932) --- .../constraints/TypeCompatibilityConstraint.java | 8 +++++++- .../UncheckedConversionWithRecursiveTypeParams.java | 13 +++++++++++++ .../lambda/GraphInferenceHighlightingTest.java | 4 ++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/UncheckedConversionWithRecursiveTypeParams.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/TypeCompatibilityConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/TypeCompatibilityConstraint.java index f01c82cae769..7b76a68ab5d3 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/TypeCompatibilityConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/TypeCompatibilityConstraint.java @@ -17,6 +17,7 @@ package com.intellij.psi.impl.source.resolve.graphInference.constraints; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.graphInference.InferenceSession; +import com.intellij.psi.impl.source.resolve.graphInference.InferenceVariable; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import org.jetbrains.annotations.NotNull; @@ -72,7 +73,12 @@ public class TypeCompatibilityConstraint implements ConstraintFormula { final PsiClass sClass = sResult.getElement(); if (tClass != null && sClass != null) { final PsiSubstitutor sSubstitutor = TypeConversionUtil.getClassSubstitutor(tClass, sClass, sResult.getSubstitutor()); - if (sSubstitutor != null && PsiUtil.isRawSubstitutor(tClass, sSubstitutor)) { + if (sSubstitutor != null) { + if (PsiUtil.isRawSubstitutor(tClass, sSubstitutor)) { + return true; + } + } + else if (tClass instanceof InferenceVariable && ((PsiClassType)s).isRaw() && tClass.isInheritor(sClass, true)) { return true; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/UncheckedConversionWithRecursiveTypeParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/UncheckedConversionWithRecursiveTypeParams.java new file mode 100644 index 000000000000..f9fc707a2924 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/UncheckedConversionWithRecursiveTypeParams.java @@ -0,0 +1,13 @@ + +import java.util.List; + +class Foo { + + public void test(Foo parent) { + Foo foo = getElements(parent).get(0); + } + + public static > List getElements(E parent) { + return null; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java index 122e776fda9d..acec098d6a5b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java @@ -255,6 +255,10 @@ public class GraphInferenceHighlightingTest extends LightDaemonAnalyzerTestCase doTest(); } + public void testUncheckedConversionWithRecursiveTypeParams() throws Exception { + doTest(false); + } + private void doTest() throws Exception { doTest(false); } From 6e4595e7bdf87c4880442378e21973750476cb72 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 31 Oct 2014 13:20:24 +0100 Subject: [PATCH 7/7] capture getClass() method type (IDEA-130973) --- .../src/com/intellij/psi/util/PsiTypesUtil.java | 5 +---- .../advHighlighting7/ClassLiteral.java | 15 +++++++++++++++ .../advHighlighting7/MultiCatch.java | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java index 906b576e3369..e7f6d5706b9c 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiTypesUtil.java @@ -166,10 +166,7 @@ public class PsiTypesUtil { qualifierType = JavaPsiFacade.getInstance(project).getElementFactory().createType((PsiClass)parent.getPsi()); } } - PsiElement parent = call.getParent(); - boolean captureTopLevelWildcards = parent instanceof PsiReferenceExpression && parent.getParent() instanceof PsiMethodCallExpression || - parent instanceof PsiExpressionList; - return createJavaLangClassType(methodExpression, qualifierType, captureTopLevelWildcards); + return createJavaLangClassType(methodExpression, qualifierType, true); } return null; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ClassLiteral.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ClassLiteral.java index 97673a5f25ee..659f721faa69 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ClassLiteral.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ClassLiteral.java @@ -11,3 +11,18 @@ class Example { return getClass() == obj.getClass(); } } + +class Foo { + + public static Class> fFoo(final Foo foo) { + Class> fooClass = foo.getClass(); + fooClass = foo.getClass(); + return foo.getClass(); + } + + public static Class> fFoo1(final Foo foo) { + Class> fooClass = foo.getClass(); + fooClass = foo.getClass(); + return foo.getClass(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java index 83b2d4976ffd..a7a73af4b45a 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java @@ -60,8 +60,8 @@ abstract class C { try { g(); } catch (IE1 | IE2 e) { Class clazz1 = e.getClass(); - Class clazz2 = e.getClass(); - Class clazz3 = e.getClass(); + Class clazz2 = e.getClass(); + Class clazz3 = e.getClass(); } try { f(); }