diff options
Diffstat (limited to 'java/java-psi-impl/src/com/intellij')
16 files changed, 100 insertions, 67 deletions
diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java index 8a686f834958..2228b2628fa0 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/javadoc/JavaDocUtil.java @@ -19,6 +19,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; +import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.IncorrectOperationException; @@ -363,4 +364,8 @@ public class JavaDocUtil { return list == null ? PsiClassType.EMPTY_ARRAY : list.getReferencedTypes(); } + public static boolean isInsidePackageInfo(@Nullable PsiDocComment containingComment) { + return containingComment != null && containingComment.getOwner() == null && containingComment.getParent() instanceof PsiJavaFile; + } + } diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java index a7b7e290b42c..da32b64ea092 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1505,12 +1505,14 @@ class ControlFlowAnalyzer extends JavaElementVisitor { IElementType op = expression.getOperationTokenType(); PsiExpression operand = PsiUtil.skipParenthesizedExprDown(expression.getOperand()); - operand.accept(this); - if (op == JavaTokenType.PLUSPLUS || op == JavaTokenType.MINUSMINUS) { - if (operand instanceof PsiReferenceExpression) { - PsiVariable variable = getUsedVariable((PsiReferenceExpression)operand); - if (variable != null) { - generateWriteInstruction(variable); + if (operand != null) { + operand.accept(this); + if (op == JavaTokenType.PLUSPLUS || op == JavaTokenType.MINUSMINUS) { + if (operand instanceof PsiReferenceExpression) { + PsiVariable variable = getUsedVariable((PsiReferenceExpression)operand); + if (variable != null) { + generateWriteInstruction(variable); + } } } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java b/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java index 19da149c99b8..3c84456a0a28 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/JavaConstantExpressionEvaluator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,27 +41,29 @@ public class JavaConstantExpressionEvaluator extends JavaRecursiveElementWalking private static final Object NO_VALUE = ObjectUtils.NULL; private final ConstantExpressionVisitor myConstantExpressionVisitor; - private JavaConstantExpressionEvaluator(Set<PsiVariable> visitedVars, final boolean throwExceptionOnOverflow, final Project project, final PsiConstantEvaluationHelper.AuxEvaluator auxEvaluator) { - myMapFactory = auxEvaluator != null ? new Factory<ConcurrentMap<PsiElement, Object>>() { + private JavaConstantExpressionEvaluator(Set<PsiVariable> visitedVars, + final boolean throwExceptionOnOverflow, + @NotNull Project project, + final PsiConstantEvaluationHelper.AuxEvaluator auxEvaluator) { + myMapFactory = auxEvaluator == null ? new Factory<ConcurrentMap<PsiElement, Object>>() { @Override public ConcurrentMap<PsiElement, Object> create() { - return auxEvaluator.getCacheMap(throwExceptionOnOverflow); + final Key<CachedValue<ConcurrentMap<PsiElement, Object>>> key = + throwExceptionOnOverflow ? CONSTANT_VALUE_WITH_OVERFLOW_MAP_KEY : CONSTANT_VALUE_WO_OVERFLOW_MAP_KEY; + return CachedValuesManager.getManager(myProject).getCachedValue(myProject, key, PROVIDER, false); } } : new Factory<ConcurrentMap<PsiElement, Object>>() { @Override public ConcurrentMap<PsiElement, Object> create() { - final Key<CachedValue<ConcurrentMap<PsiElement, Object>>> key = - throwExceptionOnOverflow ? CONSTANT_VALUE_WITH_OVERFLOW_MAP_KEY : CONSTANT_VALUE_WO_OVERFLOW_MAP_KEY; - return CachedValuesManager.getManager(myProject).getCachedValue(myProject, key, PROVIDER, false); + return auxEvaluator.getCacheMap(throwExceptionOnOverflow); } }; myProject = project; myConstantExpressionVisitor = new ConstantExpressionVisitor(visitedVars, throwExceptionOnOverflow, auxEvaluator); - } @Override - protected void elementFinished(PsiElement element) { + protected void elementFinished(@NotNull PsiElement element) { Object value = getCached(element); if (value == null) { Object result = myConstantExpressionVisitor.handle(element); @@ -109,7 +111,9 @@ public class JavaConstantExpressionEvaluator extends JavaRecursiveElementWalking return computeConstantExpression(expression, visitedVars, throwExceptionOnOverflow, null); } - public static Object computeConstantExpression(@Nullable PsiExpression expression, @Nullable Set<PsiVariable> visitedVars, boolean throwExceptionOnOverflow, + public static Object computeConstantExpression(@Nullable PsiExpression expression, + @Nullable Set<PsiVariable> visitedVars, + boolean throwExceptionOnOverflow, final PsiConstantEvaluationHelper.AuxEvaluator auxEvaluator) { if (expression == null) return null; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java index 938b40f51bb8..19e77db037e2 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java @@ -97,9 +97,9 @@ public class PsiImplUtil { if (referenceElement != null) { PsiElement resolved = referenceElement.resolve(); if (resolved != null) { - PsiMethod[] methods = ((PsiClass)resolved).getMethods(); + PsiMethod[] methods = ((PsiClass)resolved).findMethodsByName(attributeName, false); for (PsiMethod method : methods) { - if (PsiUtil.isAnnotationMethod(method) && Comparing.equal(method.getName(), attributeName)) { + if (PsiUtil.isAnnotationMethod(method)) { return ((PsiAnnotationMethod)method).getDefaultValue(); } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiAnnotationMethodImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiAnnotationMethodImpl.java index def3bb307a14..abff53174f68 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiAnnotationMethodImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiAnnotationMethodImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ import org.jetbrains.annotations.NotNull; * @author ven */ public class PsiAnnotationMethodImpl extends PsiMethodImpl implements PsiAnnotationMethod { - private SoftReference<PsiAnnotationMemberValue> myCachedDefaultValue = null; + private SoftReference<PsiAnnotationMemberValue> myCachedDefaultValue; public PsiAnnotationMethodImpl(final PsiMethodStub stub) { super(stub, JavaStubElementTypes.ANNOTATION_METHOD); @@ -62,7 +62,7 @@ public class PsiAnnotationMethodImpl extends PsiMethodImpl implements PsiAnnotat return value; } - @NonNls final String annoText = "@interface _Dummy_ { Class foo() default " + text + "; }"; + @NonNls final String annoText = "@interface _Dummy_ { " + getReturnType() + " " + getName() + "() default " + text + "; }"; final PsiFileFactory factory = PsiFileFactory.getInstance(getProject()); final PsiJavaFile file = (PsiJavaFile)factory.createFileFromText("a.java", JavaFileType.INSTANCE, annoText); value = ((PsiAnnotationMethod)file.getClasses()[0].getMethods()[0]).getDefaultValue(); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiFieldImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiFieldImpl.java index 367a8bb6e014..78c5c2d8fdc8 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiFieldImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiFieldImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -250,7 +250,7 @@ public class PsiFieldImpl extends JavaStubPsiElement<PsiFieldStub> implements Ps private static final OurConstValueComputer INSTANCE = new OurConstValueComputer(); @Override - public Object execute(PsiVariable variable, Set<PsiVariable> visitedVars) { + public Object execute(@NotNull PsiVariable variable, Set<PsiVariable> visitedVars) { return ((PsiFieldImpl)variable)._computeConstantValue(visitedVars); } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java index 807b42d60383..c1893da7162e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java @@ -15,6 +15,7 @@ */ package com.intellij.psi.impl.source; +import com.intellij.codeInsight.javadoc.JavaDocUtil; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -162,7 +163,7 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme i == JavaDocElementType.DOC_REFERENCE_HOLDER || i == JavaDocElementType.DOC_TYPE_HOLDER) { PsiDocComment docComment = PsiTreeUtil.getParentOfType(this, PsiDocComment.class); - if (docComment != null && docComment.getOwner() == null && docComment.getParent() instanceof PsiJavaFile) { + if (JavaDocUtil.isInsidePackageInfo(docComment)) { return CLASS_FQ_OR_PACKAGE_NAME_KIND; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java index b2c934ef9783..14764b25b4ee 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -144,6 +144,6 @@ public class JavaResolveCache { } public interface ConstValueComputer{ - Object execute(PsiVariable variable, Set<PsiVariable> visitedVars); + Object execute(@NotNull PsiVariable variable, Set<PsiVariable> visitedVars); } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 7d6166a7f95a..27e34f00a25f 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -20,6 +20,7 @@ import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.psi.*; +import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.source.resolve.graphInference.constraints.*; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.search.GlobalSearchScope; @@ -27,6 +28,7 @@ import com.intellij.psi.util.*; import com.intellij.util.ArrayUtilRt; import com.intellij.util.Function; import com.intellij.util.Processor; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -220,8 +222,9 @@ public class InferenceSession { return prepareSubstitution(); } - if (parameters != null && args != null) { - final Set<ConstraintFormula> additionalConstraints = new HashSet<ConstraintFormula>(); + if (parameters != null && args != null && + !MethodCandidateInfo.ourOverloadGuard.currentStack().contains(PsiUtil.skipParenthesizedExprUp(parent.getParent()))) { + final Set<ConstraintFormula> additionalConstraints = new LinkedHashSet<ConstraintFormula>(); if (parameters.length > 0) { collectAdditionalConstraints(parameters, args, properties.getMethod(), PsiSubstitutor.EMPTY, additionalConstraints, properties.isVarargs(), true); } @@ -782,6 +785,7 @@ public class InferenceSession { PsiSubstitutor substitutor) { final List<PsiType> lowerBounds = variable.getBounds(boundType); PsiType lub = PsiType.NULL; + List<PsiType> dTypes = new ArrayList<PsiType>(); for (PsiType lowerBound : lowerBounds) { lowerBound = substituteNonProperBound(lowerBound, substitutor); final HashSet<InferenceVariable> dependencies = new HashSet<InferenceVariable>(); @@ -830,35 +834,21 @@ public class InferenceSession { } private boolean proceedWithAdditionalConstraints(Set<ConstraintFormula> additionalConstraints) { - final Set<InferenceVariable> mentionedVars = new HashSet<InferenceVariable>(); - for (ConstraintFormula constraint : additionalConstraints) { - if (constraint instanceof InputOutputConstraintFormula) { - final Set<InferenceVariable> inputVariables = ((InputOutputConstraintFormula)constraint).getInputVariables(this); - if (inputVariables != null) { - mentionedVars.addAll(inputVariables); - } - final Set<InferenceVariable> outputVariables = ((InputOutputConstraintFormula)constraint).getOutputVariables(inputVariables, this); - if (outputVariables != null) { - mentionedVars.addAll(outputVariables); - } - } - } - - final Set<InferenceVariable> readyVariables = new LinkedHashSet<InferenceVariable>(myInferenceVariables.values()); - readyVariables.removeAll(mentionedVars); - - final PsiSubstitutor siteSubstitutor = resolveBounds(readyVariables, mySiteSubstitutor); + final PsiSubstitutor siteSubstitutor = mySiteSubstitutor; while (!additionalConstraints.isEmpty()) { //extract subset of constraints final Set<ConstraintFormula> subset = buildSubset(additionalConstraints); //collect all input variables of selection - final Set<InferenceVariable> varsToResolve = new HashSet<InferenceVariable>(); + final Set<InferenceVariable> varsToResolve = new LinkedHashSet<InferenceVariable>(); for (ConstraintFormula formula : subset) { if (formula instanceof InputOutputConstraintFormula) { final Set<InferenceVariable> inputVariables = ((InputOutputConstraintFormula)formula).getInputVariables(this); if (inputVariables != null) { + for (InferenceVariable inputVariable : inputVariables) { + varsToResolve.addAll(inputVariable.getDependencies(this)); + } varsToResolve.addAll(inputVariables); } } @@ -895,7 +885,7 @@ public class InferenceSession { private Set<ConstraintFormula> buildSubset(final Set<ConstraintFormula> additionalConstraints) { - final Set<ConstraintFormula> subset = new HashSet<ConstraintFormula>(); + final Set<ConstraintFormula> subset = new LinkedHashSet<ConstraintFormula>(); final Set<InferenceVariable> outputVariables = new HashSet<InferenceVariable>(); for (ConstraintFormula constraint : additionalConstraints) { if (constraint instanceof InputOutputConstraintFormula) { @@ -913,8 +903,19 @@ public class InferenceSession { if (inputVariables != null) { boolean dependsOnOutput = false; for (InferenceVariable inputVariable : inputVariables) { + if (dependsOnOutput) break; + if (inputVariable.hasInstantiation(this)) continue; final Set<InferenceVariable> dependencies = inputVariable.getDependencies(this); dependencies.add(inputVariable); + if (!hasCapture(inputVariable)) { + for (InferenceVariable outputVariable : outputVariables) { + if (ContainerUtil.intersects(outputVariable.getDependencies(this), dependencies)) { + dependsOnOutput = true; + break; + } + } + } + dependencies.retainAll(outputVariables); if (!dependencies.isEmpty()) { dependsOnOutput = true; @@ -971,7 +972,8 @@ public class InferenceSession { for (int i = 0; i < functionalMethodParameters.length; i++) { final PsiType pType = signature.getParameterTypes()[i]; - addConstraint(new TypeCompatibilityConstraint(getParameterType(parameters, i, PsiSubstitutor.EMPTY, varargs), pType)); + addConstraint(new TypeCompatibilityConstraint(getParameterType(parameters, i, PsiSubstitutor.EMPTY, varargs), + PsiImplUtil.normalizeWildcardTypeByPosition(pType, reference))); } } else if (parameters.length + 1 == functionalMethodParameters.length && !varargs || @@ -1005,7 +1007,8 @@ public class InferenceSession { for (int i = 0; i < signature.getParameterTypes().length - 1; i++) { final PsiType interfaceParamType = signature.getParameterTypes()[i + 1]; - addConstraint(new TypeCompatibilityConstraint(getParameterType(parameters, i, PsiSubstitutor.EMPTY, varargs), interfaceParamType)); + addConstraint(new TypeCompatibilityConstraint(getParameterType(parameters, i, PsiSubstitutor.EMPTY, varargs), + PsiImplUtil.normalizeWildcardTypeByPosition(interfaceParamType, reference))); } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java index a19961f4c3a9..6bc9e0b89871 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceVariable.java @@ -115,6 +115,16 @@ public class InferenceVariable extends LightTypeParameter { return dependencies; } + public boolean hasInstantiation(InferenceSession session) { + List<PsiType> bounds = getBounds(InferenceBound.EQ); + if (bounds != null) { + for (PsiType bound : bounds) { + if (session.isProperType(bound)) return true; + } + } + return false; + } + public boolean isThrownBound() { return myThrownBound; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java index 9516265a8cb5..eefd040b2a99 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/PsiMethodReferenceCompatibilityConstraint.java @@ -63,7 +63,6 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm final PsiType[] typeParameters = myExpression.getTypeParameters(); final PsiMethodReferenceUtil.QualifierResolveResult qualifierResolveResult = PsiMethodReferenceUtil.getQualifierResolveResult(myExpression); - PsiSubstitutor psiSubstitutor = qualifierResolveResult.getSubstitutor(); if (!myExpression.isExact()) { for (PsiParameter parameter : targetParameters) { @@ -78,6 +77,7 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm final PsiClass applicableMemberContainingClass = applicableMember.getContainingClass(); final PsiClass containingClass = qualifierResolveResult.getContainingClass(); + PsiSubstitutor psiSubstitutor = qualifierResolveResult.getSubstitutor(); psiSubstitutor = applicableMemberContainingClass == null || containingClass == null || myExpression.isConstructor() ? psiSubstitutor : TypeConversionUtil.getSuperClassSubstitutor(applicableMemberContainingClass, containingClass, psiSubstitutor); @@ -146,11 +146,16 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm final PsiType referencedMethodReturnType; final PsiClass containingClass = method.getContainingClass(); LOG.assertTrue(containingClass != null, method); - PsiClass qContainingClass = qualifierResolveResult.getContainingClass(); - if (qContainingClass != null && InheritanceUtil.isInheritorOrSelf(qContainingClass, containingClass, true)) { - psiSubstitutor = TypeConversionUtil.getClassSubstitutor(containingClass, qContainingClass, PsiSubstitutor.EMPTY); - LOG.assertTrue(psiSubstitutor != null); + PsiSubstitutor psiSubstitutor = qualifierResolveResult.getSubstitutor(); + if (qContainingClass != null) { + if ( PsiUtil.isRawSubstitutor(qContainingClass, psiSubstitutor)) { + psiSubstitutor = PsiSubstitutor.EMPTY; + } + if (qContainingClass.isInheritor(containingClass, true)) { + psiSubstitutor = TypeConversionUtil.getClassSubstitutor(containingClass, qContainingClass, PsiSubstitutor.EMPTY); + LOG.assertTrue(psiSubstitutor != null); + } } if (method.isConstructor()) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodReferenceResolver.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodReferenceResolver.java index 4066c6cc4a78..29525add1549 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodReferenceResolver.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/MethodReferenceResolver.java @@ -231,8 +231,8 @@ public class MethodReferenceResolver implements ResolveCache.PolyVariantContextR checkSameSignatures(conflicts); checkAccessStaticLevels(conflicts, true); - final PsiType[] parameterTypes = mySignature.getParameterTypes(); - boolean hasReceiver = PsiMethodReferenceUtil.hasReceiver(parameterTypes, myQualifierResolveResult, myReferenceExpression); + final PsiType[] argTypes = mySignature.getParameterTypes(); + boolean hasReceiver = PsiMethodReferenceUtil.hasReceiver(argTypes, myQualifierResolveResult, myReferenceExpression); final List<CandidateInfo> firstCandidates = new ArrayList<CandidateInfo>(); final List<CandidateInfo> secondCandidates = new ArrayList<CandidateInfo>(); @@ -242,19 +242,19 @@ public class MethodReferenceResolver implements ResolveCache.PolyVariantContextR final PsiMethod psiMethod = ((MethodCandidateInfo)conflict).getElement(); final PsiSubstitutor substitutor = conflict.getSubstitutor(); - final PsiType[] signatureParameterTypes2 = psiMethod.getSignature(substitutor).getParameterTypes(); + final PsiType[] parameterTypes = psiMethod.getSignature(substitutor).getParameterTypes(); final boolean varargs = ((MethodCandidateInfo)conflict).isVarargs(); if (varargs && (!psiMethod.isVarArgs() || myFunctionalMethodVarArgs)) continue; - if ((varargs || parameterTypes.length == signatureParameterTypes2.length) && - PsiMethodReferenceUtil.isCorrectAssignment(signatureParameterTypes2, parameterTypes, varargs, 0)) { + if ((varargs || argTypes.length == parameterTypes.length) && + PsiMethodReferenceUtil.isCorrectAssignment(parameterTypes, argTypes, varargs, 0)) { firstCandidates.add(conflict); } if (hasReceiver && - (varargs || parameterTypes.length == signatureParameterTypes2.length + 1) && - PsiMethodReferenceUtil.isCorrectAssignment(signatureParameterTypes2, parameterTypes, varargs, 1)) { + (varargs || argTypes.length == parameterTypes.length + 1) && + PsiMethodReferenceUtil.isCorrectAssignment(parameterTypes, argTypes, varargs, 1)) { secondCandidates.add(conflict); } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java index 73639b26c945..5bf3addded5f 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java @@ -92,7 +92,7 @@ public class PsiConditionalExpressionImpl extends ExpressionPsiElement implement if (PsiUtil.isLanguageLevel8OrHigher(this) && PsiPolyExpressionUtil.isPolyExpression(this) && - !MethodCandidateInfo.ourOverloadGuard.currentStack().contains(this.getParent())) { + !MethodCandidateInfo.ourOverloadGuard.currentStack().contains(PsiUtil.skipParenthesizedExprUp(this.getParent()))) { //15.25.3 Reference Conditional Expressions // The type of a poly reference conditional expression is the same as its target type. return InferenceSession.getTargetType(this); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiKeywordImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiKeywordImpl.java index f39a88e8b35c..cdc2fa881c0b 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiKeywordImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiKeywordImpl.java @@ -25,6 +25,7 @@ import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; +import java.util.Locale; public class PsiKeywordImpl extends LeafPsiElement implements PsiKeyword, PsiJavaToken { public PsiKeywordImpl(@NotNull IElementType type, CharSequence text) { @@ -52,7 +53,7 @@ public class PsiKeywordImpl extends LeafPsiElement implements PsiKeyword, PsiJav static { for(Field field: PsiKeyword.class.getFields()) { - CharTableImpl.staticIntern(field.getName().toLowerCase()); + CharTableImpl.staticIntern(field.getName().toLowerCase(Locale.ENGLISH)); } } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java index e5892be2fb4d..ce38729027d9 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLiteralExpressionImpl.java @@ -31,6 +31,8 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Locale; + public class PsiLiteralExpressionImpl extends ExpressionPsiElement implements PsiLiteralExpression, PsiLanguageInjectionHost, ContributedReferenceHost { @@ -93,7 +95,7 @@ public class PsiLiteralExpressionImpl @Override public Object getValue() { final IElementType type = getLiteralElementType(); - String text = NUMERIC_LITERALS.contains(type) ? getCanonicalText().toLowerCase() : getCanonicalText(); + String text = NUMERIC_LITERALS.contains(type) ? getCanonicalText().toLowerCase(Locale.ENGLISH) : getCanonicalText(); final int textLength = text.length(); if (type == JavaTokenType.INTEGER_LITERAL) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java index 8dd43933c660..8b10b6326df9 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiReferenceExpressionImpl.java @@ -234,7 +234,7 @@ public class PsiReferenceExpressionImpl extends PsiReferenceExpressionBase imple } @Override - protected void elementFinished(PsiElement element) { + protected void elementFinished(@NotNull PsiElement element) { if (!(element instanceof PsiReferenceExpressionImpl)) return; PsiReferenceExpressionImpl expression = (PsiReferenceExpressionImpl)element; resolveCache.resolveWithCaching(expression, INSTANCE, false, false, containingFile); |