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-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/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(); } 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); } 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 000000000000..8968229a6f58 Binary files /dev/null and b/platform/icons/src/icons/ide/nextStep@2x.png differ diff --git a/platform/icons/src/icons/ide/nextStepGrayed@2x.png b/platform/icons/src/icons/ide/nextStepGrayed@2x.png new file mode 100644 index 000000000000..12f3ee9480c0 Binary files /dev/null and b/platform/icons/src/icons/ide/nextStepGrayed@2x.png differ diff --git a/platform/icons/src/icons/ide/nextStepInverted@2x.png b/platform/icons/src/icons/ide/nextStepInverted@2x.png new file mode 100644 index 000000000000..ca8155765ee7 Binary files /dev/null and b/platform/icons/src/icons/ide/nextStepInverted@2x.png differ 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..6c2be5072224 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: + *
+ * + *

    + *
  • patterns := pattern(';'pattern)* + *
  • pattern := ('['moduleRegEx']')? directoryAntPattern + *
+ * + * Where + *
    + *
  • moduleRegex - regular expression to match module name. + *
  • directoryAntPattern - ant-style pattern to match folder in a module. + * directoryAntPattern considers paths relative to a content root of a module. + *
+ * + * + *

+ * 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 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>(); final String patterns = System.getProperty(propertyKey); 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 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