Merge branch 'master' of git@git.labs.intellij.net:idea/community

This commit is contained in:
Kirill Kalishev
2011-02-21 16:03:12 +03:00
61 changed files with 857 additions and 470 deletions
@@ -15,9 +15,8 @@
*/
package com.intellij.debugger.ui.tree.render;
import com.intellij.ui.classFilter.ClassFilter;
import com.intellij.debugger.DebuggerContext;
import com.intellij.debugger.DebuggerBundle;
import com.intellij.debugger.DebuggerContext;
import com.intellij.debugger.engine.DebugProcessImpl;
import com.intellij.debugger.engine.evaluation.EvaluateException;
import com.intellij.debugger.engine.evaluation.EvaluationContext;
@@ -29,6 +28,7 @@ import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.JDOMExternalizerUtil;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.PsiExpression;
import com.intellij.ui.classFilter.ClassFilter;
import com.intellij.xdebugger.impl.ui.XDebuggerUIConstants;
import com.sun.jdi.*;
import org.jdom.Element;
@@ -73,7 +73,7 @@ public class ToStringRenderer extends NodeRendererImpl {
final Value value = valueDescriptor.getValue();
BatchEvaluator.getBatchEvaluator(evaluationContext.getDebugProcess()).invoke(new ToStringCommand(evaluationContext, value) {
public void evaluationResult(String message) {
valueDescriptor.setValueLabel(message != null ? "\"" + message + "\"" : "");
valueDescriptor.setValueLabel(message != null ? "\"" + DebuggerUtilsEx.truncateString(message) + "\"" : "");
labelListener.labelChanged();
}
@@ -107,6 +107,19 @@ public class GenericsHighlightUtil {
}
}
PsiDiamondType.DiamondInferenceResult inferenceResult = null;
PsiTypeElement[] referenceElements = null;
if (referenceParameterList != null) {
referenceElements = referenceParameterList.getTypeParameterElements();
if (referenceElements.length == 1 && referenceElements[0].getType() instanceof PsiDiamondType) {
inferenceResult = ((PsiDiamondType)referenceElements[0].getType()).resolveInferredTypes();
final String errorMessage = inferenceResult.getErrorMessage();
if (errorMessage != null) {
return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, referenceElements[0], errorMessage);
}
}
}
final PsiTypeParameter[] typeParameters = typeParameterListOwner.getTypeParameters();
final int targetParametersNum = typeParameters.length;
final int refParametersNum = referenceParameterList == null ? 0 : referenceParameterList.getTypeArguments().length;
@@ -140,9 +153,8 @@ public class GenericsHighlightUtil {
// bounds check
if (targetParametersNum > 0 && refParametersNum != 0) {
final PsiTypeElement[] referenceElements = referenceParameterList.getTypeParameterElements();
if (referenceElements.length == 1 && referenceElements[0].getType() instanceof PsiDiamondType) {
final PsiType[] types = ((PsiDiamondType)referenceElements[0].getType()).getInferredTypes();
if (inferenceResult != null) {
final PsiType[] types = inferenceResult.getTypes();
for (int i = 0; i < typeParameters.length; i++) {
final PsiType type = types[i];
final HighlightInfo highlightInfo = checkTypeParameterWithinItsBound(typeParameters[i], substitutor, type, referenceElements[0]);
@@ -24,7 +24,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.impl.JavaPsiFacadeEx;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
@@ -61,23 +60,18 @@ public class CreateMethodQuickFix implements LocalQuickFix {
}
public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) {
try {
if (!CodeInsightUtilBase.preparePsiElementForWrite(myTargetClass.getContainingFile())) return;
if (!CodeInsightUtilBase.preparePsiElementForWrite(myTargetClass.getContainingFile())) return;
PsiMethod method = createMethod(project);
List<Pair<PsiExpression, PsiType>> arguments =
ContainerUtil.map2List(method.getParameterList().getParameters(), new Function<PsiParameter, Pair<PsiExpression, PsiType>>() {
public Pair<PsiExpression, PsiType> fun(PsiParameter psiParameter) {
return Pair.create(null, psiParameter.getType());
}
});
PsiMethod method = createMethod(project);
List<Pair<PsiExpression, PsiType>> arguments =
ContainerUtil.map2List(method.getParameterList().getParameters(), new Function<PsiParameter, Pair<PsiExpression, PsiType>>() {
public Pair<PsiExpression, PsiType> fun(PsiParameter psiParameter) {
return Pair.create(null, psiParameter.getType());
}
});
method = (PsiMethod)JavaCodeStyleManager.getInstance(project).shortenClassReferences((PsiMethod)myTargetClass.add(method));
CreateMethodFromUsageFix.doCreate(myTargetClass, method, arguments, PsiSubstitutor.EMPTY, ExpectedTypeInfo.EMPTY_ARRAY, method);
}
catch (IncorrectOperationException e) {
throw new RuntimeException(e);
}
method = (PsiMethod)JavaCodeStyleManager.getInstance(project).shortenClassReferences((PsiMethod)myTargetClass.add(method));
CreateMethodFromUsageFix.doCreate(myTargetClass, method, arguments, PsiSubstitutor.EMPTY, ExpectedTypeInfo.EMPTY_ARRAY, method);
}
private PsiMethod createMethod(Project project) {
@@ -22,6 +22,7 @@ import com.intellij.codeInsight.daemon.impl.actions.AddImportAction;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.compiler.ModuleCompilerUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.Result;
@@ -42,8 +43,6 @@ import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.compiler.ModuleCompilerUtil;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -72,12 +71,7 @@ public abstract class OrderEntryFix implements IntentionAction, LocalQuickFix {
}
public void applyFix(@NotNull final Project project, @NotNull final ProblemDescriptor descriptor) {
try {
invoke(project, null, descriptor.getPsiElement().getContainingFile());
}
catch (IncorrectOperationException e) {
throw new RuntimeException(e);
}
invoke(project, null, descriptor.getPsiElement().getContainingFile());
}
@Nullable
@@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
@@ -65,15 +66,39 @@ public class ExplicitTypeCanBeDiamondInspection extends BaseJavaLocalInspectionT
@Override
public void visitNewExpression(PsiNewExpression expression) {
if (PsiUtil.getLanguageLevel(expression).isAtLeast(LanguageLevel.JDK_1_7)) {
final PsiJavaCodeReferenceElement classReference = expression.getClassReference();
final PsiJavaCodeReferenceElement classReference = expression.getClassOrAnonymousClassReference();
if (classReference != null) {
final PsiReferenceParameterList parameterList = classReference.getParameterList();
if (parameterList != null) {
final PsiTypeElement[] typeElements = parameterList.getTypeParameterElements();
if (typeElements.length > 0) {
if (typeElements.length == 1 && typeElements[0].getType() instanceof PsiDiamondType) return;
holder.registerProblem(parameterList, "Redundant type argument #ref #loc",
ProblemHighlightType.LIKE_UNUSED_SYMBOL, new ReplaceWithDiamondFix());
final PsiDiamondType.DiamondInferenceResult inferenceResult = PsiDiamondType.resolveInferredTypes(expression);
if (inferenceResult.getErrorMessage() == null) {
final PsiType[] types = inferenceResult.getTypes();
final PsiType[] typeArguments = parameterList.getTypeArguments();
if (types.length == typeArguments.length) {
for (int i = 0, typeArgumentsLength = typeArguments.length; i < typeArgumentsLength; i++) {
PsiType typeArgument = typeArguments[i];
if (types[i] instanceof PsiWildcardType) {
final PsiWildcardType wildcardType = (PsiWildcardType)types[i];
final PsiType bound = wildcardType.getBound();
if (bound != null) {
if (wildcardType.isExtends()) {
if (bound.isAssignableFrom(typeArgument)) continue;
} else {
if (typeArgument.isAssignableFrom(bound)) continue;
}
}
}
if (!typeArgument.equals(types[i])) {
return;
}
}
}
holder.registerProblem(parameterList, "Redundant type argument #ref #loc",
ProblemHighlightType.LIKE_UNUSED_SYMBOL, new ReplaceWithDiamondFix());
}
}
}
}
@@ -23,6 +23,7 @@ import com.intellij.openapi.roots.ui.util.ModifiableCellAppearance;
import com.intellij.openapi.util.Iconable;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.psi.util.PsiFormatUtilBase;
import com.intellij.ui.ColoredTreeCellRenderer;
import com.intellij.ui.SimpleTextAttributes;
@@ -51,7 +52,8 @@ public class StructureNodeRenderer extends ColoredTreeCellRenderer {
ModifiableCellAppearance result;
if (psiElement instanceof PsiElement && !((PsiElement)psiElement).isValid()) {
result = CompositeAppearance.single(name);
} else {
}
else {
PsiClass psiClass = getContainingClass(psiElement);
if (isInheritedMember(node, psiClass) && psiClass != null) {
CompositeAppearance.DequeEnd ending = new CompositeAppearance().getEnding();
@@ -84,13 +86,13 @@ public class StructureNodeRenderer extends ColoredTreeCellRenderer {
}
}
public static String getNameOf(PsiElement psiElement) {
private static String getNameOf(PsiElement psiElement) {
if (psiElement instanceof PsiMethod)
return PsiFormatUtil.formatMethod((PsiMethod)psiElement,
PsiSubstitutor.EMPTY,
PsiFormatUtil.SHOW_NAME | PsiFormatUtil.SHOW_TYPE | PsiFormatUtil.TYPE_AFTER |
PsiFormatUtil.SHOW_PARAMETERS,
PsiFormatUtil.SHOW_TYPE
PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_TYPE | PsiFormatUtilBase.TYPE_AFTER |
PsiFormatUtilBase.SHOW_PARAMETERS,
PsiFormatUtilBase.SHOW_TYPE
);
return psiElement.toString();
}
@@ -109,23 +111,17 @@ public class StructureNodeRenderer extends ColoredTreeCellRenderer {
return new SimpleTextAttributes(nameAttributes.getStyle() | SimpleTextAttributes.STYLE_STRIKEOUT, nameAttributes.getFgColor());
}
public static boolean isDeprecated(Object psiElement) {
if (psiElement instanceof PsiDocCommentOwner)
return ((PsiDocCommentOwner) psiElement).isDeprecated();
return false;
private static boolean isDeprecated(Object psiElement) {
return psiElement instanceof PsiDocCommentOwner && ((PsiDocCommentOwner)psiElement).isDeprecated();
}
public static PsiClass getContainingClass(Object element) {
private static PsiClass getContainingClass(Object element) {
if (element instanceof PsiMember)
return ((PsiMember) element).getContainingClass();
if (element instanceof PsiClass) {
PsiElement parent = ((PsiClass) element).getParent();
return (PsiClass) (parent instanceof PsiClass ? parent : null);
}
return null;
}
public static PsiClass getTreeParentClass(Object value) {
private static PsiClass getTreeParentClass(Object value) {
if (!(value instanceof TreeNode))
return null;
for (TreeNode treeNode = ((TreeNode) value).getParent(); treeNode != null; treeNode = treeNode.getParent()) {
@@ -35,10 +35,8 @@ public class JavaClassTreeElement extends JavaClassTreeElementBase<PsiClass> {
}
private Collection<StructureViewTreeElement> getClassChildren() {
ArrayList<StructureViewTreeElement> array = new ArrayList<StructureViewTreeElement>();
final PsiClass aClass = getElement();
if (aClass == null) return array;
if (aClass == null) return Collections.emptyList();
List<PsiElement> children = Arrays.asList(aClass.getChildren());
Collection<PsiElement> ownChildren = new THashSet<PsiElement>();
@@ -47,6 +45,7 @@ public class JavaClassTreeElement extends JavaClassTreeElementBase<PsiClass> {
ContainerUtil.addAll(ownChildren, aClass.getInnerClasses());
ContainerUtil.addAll(ownChildren, aClass.getInitializers());
Collection<PsiElement> inherited = new LinkedHashSet<PsiElement>(children);
List<StructureViewTreeElement> array = new ArrayList<StructureViewTreeElement>(inherited.size());
aClass.processDeclarations(new AddAllMembersProcessor(inherited, aClass), ResolveState.initial(), null, aClass);
@@ -26,7 +26,6 @@ import java.util.ArrayList;
import java.util.Collection;
public class JavaFileTreeElement extends PsiTreeElementBase<PsiJavaFile> implements ItemPresentation {
public JavaFileTreeElement(PsiJavaFile file) {
super(file);
}
@@ -68,7 +68,7 @@ public class PomJavaAspectImpl extends PomJavaAspect implements ProjectComponent
if(changeSet == null) return;
final PsiFile containingFile = changeSet.getRootElement().getPsi().getContainingFile();
if(!(containingFile.getLanguage() instanceof JavaLanguage)) return;
final PomJavaAspectChangeSet set = new PomJavaAspectChangeSet(myPomModel, containingFile);
final PomJavaAspectChangeSet set = new PomJavaAspectChangeSet(myPomModel);
set.addChange(new JavaTreeChanged(containingFile));
event.registerChangeSet(this, set);
}
@@ -233,7 +233,7 @@ public class PsiImplUtil {
types[i] = typeElements[i].getType();
}
if (types.length == 1 && types[0] instanceof PsiDiamondType) {
return ((PsiDiamondType)types[0]).getInferredTypes();
return ((PsiDiamondType)types[0]).resolveInferredTypes().getTypes();
}
return types;
}
@@ -403,8 +403,8 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
final boolean forCompletion) {
PsiTypeParameterListOwner owner = typeParameter.getOwner();
Pair<PsiType, ConstraintType> substitution = null;
if (owner instanceof PsiMethod && parent instanceof PsiMethodCallExpression) {
PsiMethodCallExpression methodCall = (PsiMethodCallExpression)parent;
if (owner instanceof PsiMethod && parent instanceof PsiCallExpression) {
PsiCallExpression methodCall = (PsiCallExpression)parent;
substitution = inferMethodTypeParameterFromParent(methodCall.getParent(), methodCall, typeParameter, substitutor, forCompletion);
}
return substitution;
@@ -604,7 +604,7 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
}
private static Pair<PsiType, ConstraintType> inferMethodTypeParameterFromParent(PsiElement parent,
PsiMethodCallExpression methodCall,
PsiCallExpression methodCall,
final PsiTypeParameter typeParameter,
PsiSubstitutor substitutor,
final boolean forCompletion) {
@@ -701,13 +701,13 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
return result;
}
private static final ThreadLocal<List<PsiMethodCallExpression>> myBlockedForInferenceMethodCalls = new ThreadLocal<List<PsiMethodCallExpression>>() {
protected List<PsiMethodCallExpression> initialValue() {
return new ArrayList<PsiMethodCallExpression>(2);
private static final ThreadLocal<List<PsiCallExpression>> myBlockedForInferenceMethodCalls = new ThreadLocal<List<PsiCallExpression>>() {
protected List<PsiCallExpression> initialValue() {
return new ArrayList<PsiCallExpression>(2);
}
};
private static Pair<PsiType, ConstraintType> inferTypeForCompletionFromCallContext(final PsiMethodCallExpression innerMethodCall,
private static Pair<PsiType, ConstraintType> inferTypeForCompletionFromCallContext(final PsiCallExpression innerMethodCall,
final PsiExpressionList expressionList,
final PsiCallExpression contextCall,
final PsiTypeParameter typeParameter) {
@@ -35,7 +35,7 @@ class P<PT> {
class Test1 {
void bar() {
foo(new FF<>());
foo<error descr="'foo(F<F<java.lang.String>>)' in 'Test1' cannot be applied to '(FF<java.lang.Object>)'">(new FF<>())</error>;
}
void foo(F<F<String>> p) {}
@@ -8,29 +8,29 @@ class Neg01<X extends Number> {
void test() {
Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> n1 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("" ); //new Foo<Integer> created
Neg01<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n2 = new Neg01<><error descr="'Neg01(java.lang.String & java.lang.Number)' in 'Neg01' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Integer> created
Neg01<?> n3 = new Neg01<><error descr="'Neg01(java.lang.Number)' in 'Neg01' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Object> created
Neg01<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n2 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Neg01<?> n3 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Neg01<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> n4 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> n5 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Integer> created
Neg01<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n6 = new Neg01<><error descr="'Neg01(java.lang.String & java.lang.Number)' in 'Neg01' cannot be applied to '(java.lang.String)'">("")</error> {
Neg01<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n6 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Integer> created
Neg01<?> n7 = new Neg01<><error descr="'Neg01(java.lang.Number)' in 'Neg01' cannot be applied to '(java.lang.String)'">("")</error> {
Neg01<?> n7 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Object> created
Neg01<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> n8 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Object> created
Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> n9 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Neg01<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n10 = new Neg01<><error descr="'Neg01(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg01' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Integer> created
Neg01<?> n11 = new Neg01<><error descr="'Neg01(java.lang.Number, java.lang.String)' in 'Neg01' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Object> created
Neg01<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n10 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Neg01<?> n11 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
<error descr="Cannot resolve symbol 'Foo'">Foo</error><? super String> n12 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> n13 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Integer> created
Neg01<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n14 = new Neg01<><error descr="'Neg01(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg01' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error> {
Neg01<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n14 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Integer> created
Neg01<?> n15 = new Neg01<><error descr="'Neg01(java.lang.Number, java.lang.String)' in 'Neg01' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error> {
Neg01<?> n15 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Object> created
Neg01<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> n16 = new Neg01<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Object> created
@@ -0,0 +1,7 @@
class Neg10 {
static class Foo<X> {
Foo(X x) {}
}
<error descr="Incompatible types. Found: 'Neg10.Foo<java.lang.Integer>', required: 'Neg10.Foo<java.lang.Number>'">Foo<Number> fw = new Foo<>(1);</error>
}
@@ -0,0 +1,8 @@
class Neg11 {
void test() {
class Foo<X extends Number> { }
Foo<?> f1 = new <error descr="Cannot resolve symbol 'UndeclaredName'">UndeclaredName</error><>(); //this is deliberate: aim is to test erroneous path
Foo<?> f2 = new <error descr="Cannot resolve symbol 'UndeclaredName'">UndeclaredName</error><>() {}; //this is deliberate: aim is to test erroneous path
}
}
@@ -10,29 +10,29 @@ class Neg02 {
void testSimple() {
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f1 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f2 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Neg02.Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Integer> created
Foo<?> f3 = new Foo<><error descr="'Foo(java.lang.Number)' in 'Neg02.Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f2 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<?> f3 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f4 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f5 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f6 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Neg02.Foo' cannot be applied to '(java.lang.String)'">("")</error> {
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f6 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Integer> created
Foo<?> f7 = new Foo< ><error descr="'Foo(java.lang.Number)' in 'Neg02.Foo' cannot be applied to '(java.lang.String)'">("")</error> {
Foo<?> f7 = new Foo< <error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f8 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f9 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f10 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg02.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Integer> created
Foo<?> f11 = new Foo< ><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Neg02.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f10 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<?> f11 = new Foo< <error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f12 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f13 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f14 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg02.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error> {
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f14 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Integer> created
Foo<?> f15 = new Foo< ><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Neg02.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error> {
Foo<?> f15 = new Foo< <error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f16 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Object> created
@@ -40,29 +40,29 @@ class Neg02 {
void testQualified() {
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f1 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f2 = new Neg02.Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Neg02.Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Integer> created
Foo<?> f3 = new Neg02.Foo< ><error descr="'Foo(java.lang.Number)' in 'Neg02.Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f2 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<?> f3 = new Neg02.Foo< <error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f4 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f5 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f6 = new Neg02.Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Neg02.Foo' cannot be applied to '(java.lang.String)'">("")</error> {
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f6 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Integer> created
Foo<?> f7 = new Neg02.Foo< ><error descr="'Foo(java.lang.Number)' in 'Neg02.Foo' cannot be applied to '(java.lang.String)'">("")</error> {
Foo<?> f7 = new Neg02.Foo< <error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f8 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {
}; //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f9 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f10 = new Neg02.Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg02.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Integer> created
Foo<?> f11 = new Neg02.Foo< ><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Neg02.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f10 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<?> f11 = new Neg02.Foo< <error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f12 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f13 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f14 = new Neg02.Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg02.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error> {
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f14 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Integer> created
Foo<?> f15 = new Neg02.Foo< ><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Neg02.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error> {
Foo<?> f15 = new Neg02.Foo< <error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f16 = new Neg02.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", "") {
}; //new Foo<Object> created
@@ -7,67 +7,67 @@ class Neg03<U> {
void testSimple() {
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f1 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f2 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Integer> created
Foo<?> f3 = new Foo<><error descr="'Foo(java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f2 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<?> f3 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f4 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f5 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f6 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>{}; //new Foo<Integer> created
Foo<?> f7 = new Foo<><error descr="'Foo(java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>{}; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f6 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Integer> created
Foo<?> f7 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f8 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f9 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f10 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Integer> created
Foo<?> f11 = new Foo<><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f10 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<?> f11 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f12 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f13 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f14 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>{}; //new Foo<Integer> created
Foo<?> f15 = new Foo<><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>{}; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f14 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Integer> created
Foo<?> f15 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f16 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Object> created
}
void testQualified_1() {
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f1 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f2 = new Neg03<U>.Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Integer> created
Foo<?> f3 = new Neg03<U>.Foo<><error descr="'Foo(java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f2 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<?> f3 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f4 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f5 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f6 = new Neg03<U>.Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>{}; //new Foo<Integer> created
Foo<?> f7 = new Neg03<U>.Foo<><error descr="'Foo(java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>{}; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f6 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Integer> created
Foo<?> f7 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f8 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f9 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f10 = new Neg03<U>.Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Integer> created
Foo<?> f11 = new Neg03<U>.Foo<><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f10 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<?> f11 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f12 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f13 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f14 = new Neg03<U>.Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>{}; //new Foo<Integer> created
Foo<?> f15 = new Neg03<U>.Foo<><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>{}; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f14 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Integer> created
Foo<?> f15 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f16 = new Neg03<U>.Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Object> created
}
void testQualified_2(Neg03<U> n) {
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f1 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f2 = n.new Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Integer> created
Foo<?> f3 = n.new Foo<><error descr="'Foo(java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f2 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<?> f3 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f4 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f5 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f6 = n.new Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>{}; //new Foo<Integer> created
Foo<?> f7 = n.new Foo<><error descr="'Foo(java.lang.Number)' in 'Neg03.Foo' cannot be applied to '(java.lang.String)'">("")</error>{}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f6 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Integer> created
Foo<?> f7 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f8 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f9 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f10 = n.new Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Integer> created
Foo<?> f11 = n.new Foo<><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f10 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<?> f11 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f12 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> f13 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f14 = n.new Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>{}; //new Foo<Integer> created
Foo<?> f15 = n.new Foo<><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Neg03.Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>{}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> f14 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Integer> created
Foo<?> f15 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> f16 = n.new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Integer> created
}
}
@@ -6,23 +6,23 @@ class Neg04 {
<Z> Foo(V x, Z z) {}
}
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> n1 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n2 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Integer> created
Foo<?> n3 = new Foo<><error descr="'Foo(java.lang.Number)' in 'Foo' cannot be applied to '(java.lang.String)'">("")</error>; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n2 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Integer> created
Foo<?> n3 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> n4 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""); //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> n5 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n6 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number)' in 'Foo' cannot be applied to '(java.lang.String)'">("")</error>{}; //new Foo<Integer> created
Foo<?> n7 = new Foo<><error descr="'Foo(java.lang.Number)' in 'Foo' cannot be applied to '(java.lang.String)'">("")</error>{}; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n6 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Integer> created
Foo<?> n7 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> n8 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>(""){}; //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> n9 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n10 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Integer> created
Foo<?> n11 = new Foo<><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n10 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Integer> created
Foo<?> n11 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> n12 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""); //new Foo<Object> created
Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'">String</error>> n13 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Integer> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n14 = new Foo<><error descr="'Foo(java.lang.String & java.lang.Number, java.lang.String)' in 'Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>{}; //new Foo<Integer> created
Foo<?> n15 = new Foo<><error descr="'Foo(java.lang.Number, java.lang.String)' in 'Foo' cannot be applied to '(java.lang.String, java.lang.String)'">("", "")</error>{}; //new Foo<Object> created
Foo<<error descr="Type parameter '? extends String' is not within its bound; should extend 'java.lang.Number'">? extends String</error>> n14 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Integer> created
Foo<?> n15 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Object> created
Foo<<error descr="Type parameter '? super String' is not within its bound; should extend 'java.lang.Number'">? super String</error>> n16 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("", ""){}; //new Foo<Object> created
}
}
@@ -0,0 +1,11 @@
class Neg06 {
interface ISuperFoo<X> {}
interface IFoo<X extends Number> extends ISuperFoo<X> {}
static class CSuperFoo<X> {}
static class CFoo<X extends Number> extends CSuperFoo<X> {}
ISuperFoo<String> isf = new IFoo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>() {};
CSuperFoo<String> csf1 = new CFoo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>();
CSuperFoo<String> csf2 = new CFoo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>() {};
}
@@ -0,0 +1,9 @@
class Neg07 {
static class SuperFoo<X> {}
static class Foo<X extends Number> extends SuperFoo<X> {
Foo(X x) {}
}
SuperFoo<String> sf1 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("");
SuperFoo<String> sf2 = new Foo<<error descr="Type parameter 'java.lang.String' is not within its bound; should extend 'java.lang.Number'"></error>>("") {};
}
@@ -0,0 +1,20 @@
class Neg08 {
static class Foo<X> {
Foo(X x) { }
}
static class DoubleFoo<X,Y> {
DoubleFoo(X x,Y y) { }
}
static class TripleFoo<X,Y,Z> {
TripleFoo(X x,Y y,Z z) { }
}
Foo<? extends Integer> fi = new Foo<>(1);
Foo<?> fw = new Foo<<error descr="Cannot infer type arguments for Foo<> because type Foo<? extends Integer> inferred is not allowed in current context"></error>>(fi);
Foo<? extends Double> fd = new Foo<>(3.0);
DoubleFoo<?,?> dw = new DoubleFoo<<error descr="Cannot infer type arguments for DoubleFoo<> because type Foo<? extends Integer> inferred is not allowed in current context"></error>>(fi,fd);
Foo<String> fs = new Foo<>("one");
TripleFoo<?,?,?> tw = new TripleFoo<<error descr="Cannot infer type arguments for TripleFoo<> because type Foo<? extends Integer> inferred is not allowed in current context"></error>>(fi,fd,fs);
}
@@ -0,0 +1,12 @@
class Neg09 {
static class Foo<X extends Number & Comparable<Number>> {}
static class DoubleFoo<X extends Number & Comparable<Number>,
Y extends Number & Comparable<Number>> {}
static class TripleFoo<X extends Number & Comparable<Number>,
Y extends Number & Comparable<Number>,
Z> {}
Foo<?> fw = new Foo<<error descr="Cannot infer type arguments for Foo<> because type ? extends Number inferred is not allowed in current context"></error>>();
DoubleFoo<?,?> dw = new DoubleFoo<<error descr="Cannot infer type arguments for DoubleFoo<> because type ? extends Number inferred is not allowed in current context"></error>>();
TripleFoo<?,?,?> tw = new TripleFoo<<error descr="Cannot infer type arguments for TripleFoo<> because type ? extends Number inferred is not allowed in current context"></error>>();
}
@@ -0,0 +1,12 @@
public class Pos05 {
static class Foo<X> {
Foo(X x) {}
}
void m(Foo<Integer> fi) {}
void test() {
m(new Foo<>(1));
}
}
@@ -1,7 +0,0 @@
// "Replace with <>" "true"
public class Test {
F<F<String>> f = new FF<>();
}
class FF<X> extends F<X>{}
class F<T> {}
@@ -1,11 +0,0 @@
// "Replace with <>" "true"
public class Test {
void bar() {
foo(new FF<>());
}
void foo(F<F<String>> p) {}
}
class FF<X> extends F<X>{}
class F<T> {}
@@ -0,0 +1,16 @@
// "Replace with <>" "true"
class Test {
void test() {
class Foo<X extends Number> {
Foo() {}
Foo(X x) {}
}
Foo<Number> f1 = new Foo<Number>(1);
Foo<?> f2 = new Foo<>();
Foo<?> f3 = new Foo<Integer>();
Foo<Number> f4 = new Foo<Number>(1) {};
Foo<?> f5 = new Foo<Number>() {};
Foo<?> f6 = new Foo<Integer>() {};
}
}
@@ -0,0 +1,16 @@
// "Replace with <>" "true"
class Test {
void test() {
class Foo<X extends Number> {
Foo() {}
Foo(X x) {}
}
Foo<Number> f1 = new Foo<Number>(1);
Foo<?> f2 = new Foo<Number>();
Foo<?> f3 = new Foo<>();
Foo<Number> f4 = new Foo<Number>(1) {};
Foo<?> f5 = new Foo<Number>() {};
Foo<?> f6 = new Foo<Integer>() {};
}
}
@@ -0,0 +1,16 @@
// "Replace with <>" "true"
class Test {
void test() {
class Foo<X extends Number> {
Foo() {}
Foo(X x) {}
}
Foo<Number> f1 = new Foo<Number>(1);
Foo<?> f2 = new Foo<Number>();
Foo<?> f3 = new Foo<Integer>();
Foo<Number> f4 = new Foo<Number>(1) {};
Foo<?> f5 = new Foo<>() {};
Foo<?> f6 = new Foo<Integer>() {};
}
}
@@ -0,0 +1,16 @@
// "Replace with <>" "true"
class Test {
void test() {
class Foo<X extends Number> {
Foo() {}
Foo(X x) {}
}
Foo<Number> f1 = new Foo<Number>(1);
Foo<?> f2 = new Foo<Number>();
Foo<?> f3 = new Foo<Integer>();
Foo<Number> f4 = new Foo<Number>(1) {};
Foo<?> f5 = new Foo<Number>() {};
Foo<?> f6 = new Foo<>() {};
}
}
@@ -1,4 +1,4 @@
// "Replace with <>" "true"
// "Replace with <>" "false"
public class Test {
F<F<String>> f = new FF<Str<caret>ing>();
}
@@ -1,4 +1,4 @@
// "Replace with <>" "true"
// "Replace with <>" "false"
public class Test {
void bar() {
foo(new FF<Str<caret>ing>());
@@ -0,0 +1,16 @@
// "Replace with <>" "false"
class Test {
void test() {
class Foo<X extends Number> {
Foo() {}
Foo(X x) {}
}
Foo<Number> f1 = new Foo<Nu<caret>mber>(1);
Foo<?> f2 = new Foo<Number>();
Foo<?> f3 = new Foo<Integer>();
Foo<Number> f4 = new Foo<Number>(1) {};
Foo<?> f5 = new Foo<Number>() {};
Foo<?> f6 = new Foo<Integer>() {};
}
}
@@ -0,0 +1,16 @@
// "Replace with <>" "true"
class Test {
void test() {
class Foo<X extends Number> {
Foo() {}
Foo(X x) {}
}
Foo<Number> f1 = new Foo<Number>(1);
Foo<?> f2 = new Foo<Num<caret>ber>();
Foo<?> f3 = new Foo<Integer>();
Foo<Number> f4 = new Foo<Number>(1) {};
Foo<?> f5 = new Foo<Number>() {};
Foo<?> f6 = new Foo<Integer>() {};
}
}
@@ -0,0 +1,16 @@
// "Replace with <>" "true"
class Test {
void test() {
class Foo<X extends Number> {
Foo() {}
Foo(X x) {}
}
Foo<Number> f1 = new Foo<Number>(1);
Foo<?> f2 = new Foo<Number>();
Foo<?> f3 = new Foo<Inte<caret>ger>();
Foo<Number> f4 = new Foo<Number>(1) {};
Foo<?> f5 = new Foo<Number>() {};
Foo<?> f6 = new Foo<Integer>() {};
}
}
@@ -0,0 +1,16 @@
// "Replace with <>" "false"
class Test {
void test() {
class Foo<X extends Number> {
Foo() {}
Foo(X x) {}
}
Foo<Number> f1 = new Foo<Number>(1);
Foo<?> f2 = new Foo<Number>();
Foo<?> f3 = new Foo<Integer>();
Foo<Number> f4 = new Foo<Nu<caret>mber>(1) {};
Foo<?> f5 = new Foo<Number>() {};
Foo<?> f6 = new Foo<Integer>() {};
}
}
@@ -0,0 +1,16 @@
// "Replace with <>" "true"
class Test {
void test() {
class Foo<X extends Number> {
Foo() {}
Foo(X x) {}
}
Foo<Number> f1 = new Foo<Number>(1);
Foo<?> f2 = new Foo<Number>();
Foo<?> f3 = new Foo<Integer>();
Foo<Number> f4 = new Foo<Number>(1) {};
Foo<?> f5 = new Foo<Numb<caret>er>() {};
Foo<?> f6 = new Foo<Integer>() {};
}
}
@@ -0,0 +1,16 @@
// "Replace with <>" "true"
class Test {
void test() {
class Foo<X extends Number> {
Foo() {}
Foo(X x) {}
}
Foo<Number> f1 = new Foo<Number>(1);
Foo<?> f2 = new Foo<Number>();
Foo<?> f3 = new Foo<Integer>();
Foo<Number> f4 = new Foo<Number>(1) {};
Foo<?> f5 = new Foo<Number>() {};
Foo<?> f6 = new Foo<In<caret>teger>() {};
}
}
@@ -429,9 +429,9 @@ class JavaAutoPopupTest extends CompletionAutoPopupTestCase {
public void testVerticalArrows() {
testArrows false, false, 0, -1
testArrows false, true, -1, 1
testArrows true, false, 0, -1
testArrows true, true, -1, 1
testArrows false, true, 0, -1
testArrows true, false, 0, 1
testArrows true, true, 0, 1
}
public void testHideOnOnePrefixVariant() {
@@ -58,6 +58,10 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
doTest(false, false);
}
public void testDiamondPos5() throws Exception {
doTest(false, false);
}
public void testDiamondNeg1() throws Exception {
doTest(false, false);
}
@@ -78,6 +82,32 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
doTest(false, false);
}
public void testDiamondNeg6() throws Exception {
doTest(false, false);
}
public void testDiamondNeg7() throws Exception {
doTest(false, false);
}
public void testDiamondNeg8() throws Exception {
doTest(false, false);
}
public void testDiamondNeg9() throws Exception {
doTest(false, false);
}
public void testDiamondNeg10() throws Exception {
doTest(false, false);
}
public void testDiamondNeg11() throws Exception {
doTest(false, false);
}
public void testDiamondMisc() throws Exception {
doTest(false, false);
}
@@ -1,14 +1,19 @@
package com.intellij.openapi.vfs;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.impl.win32.Win32LocalFileSystem;
import com.intellij.openapi.vfs.newvfs.ManagingFS;
import com.intellij.testFramework.IdeaTestCase;
import com.intellij.testFramework.IdeaTestUtil;
import org.jetbrains.annotations.NonNls;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.Arrays;
public class LocalFileSystemTest extends IdeaTestCase{
@@ -219,4 +224,20 @@ public class LocalFileSystemTest extends IdeaTestCase{
);
}
public static void setContentOnDisk(File file, byte[] bom, String content, Charset charset) throws IOException {
FileOutputStream stream = new FileOutputStream(file);
stream.write(bom);
OutputStreamWriter writer = new OutputStreamWriter(stream, charset);
writer.write(content);
writer.close();
}
public static VirtualFile createTempFile(@NonNls String ext, byte[] bom, @NonNls String content, Charset charset) throws IOException {
File temp = FileUtil.createTempFile("copy", "." + ext);
setContentOnDisk(temp, bom, content, charset);
myFilesToDelete.add(temp);
return LocalFileSystem.getInstance().refreshAndFindFileByIoFile(temp);
}
}
@@ -34,11 +34,9 @@ package com.intellij.projectView;
import com.intellij.JavaTestUtil;
import com.intellij.ide.structureView.impl.java.InheritedMembersFilter;
import com.intellij.ide.structureView.newStructureView.StructureViewComponent;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.impl.JavaSdkImpl;
import com.intellij.testFramework.IdeaTestUtil;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
@@ -48,6 +46,7 @@ import com.intellij.psi.JavaDirectoryService;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiField;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.TestSourceBasedTestCase;
import com.intellij.util.IncorrectOperationException;
@@ -69,55 +68,55 @@ public class StructureViewUpdatingTest extends TestSourceBasedTestCase {
final StructureViewComponent structureViewComponent =
(StructureViewComponent)fileEditor.getStructureViewBuilder().createStructureView(fileEditor, myProject);
final Document document = PsiDocumentManager.getInstance(myProject).getDocument(psiClass.getContainingFile());
IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(),
"-Class1.java\n" +
" -Class1\n" +
" getValue():int\n" +
" getClass():Class<? extends Object>\n" +
" hashCode():int\n" +
" equals(Object):boolean\n" +
" clone():Object\n" +
" toString():String\n" +
" notify():void\n" +
" notifyAll():void\n" +
" wait(long):void\n" +
" wait(long, int):void\n" +
" wait():void\n" +
" finalize():void\n" +
" myField1:boolean\n" +
" myField2:boolean\n");
PlatformTestUtil.assertTreeEqual(structureViewComponent.getTree(),
"-Class1.java\n" +
" -Class1\n" +
" getValue():int\n" +
" getClass():Class<? extends Object>\n" +
" hashCode():int\n" +
" equals(Object):boolean\n" +
" clone():Object\n" +
" toString():String\n" +
" notify():void\n" +
" notifyAll():void\n" +
" wait(long):void\n" +
" wait(long, int):void\n" +
" wait():void\n" +
" finalize():void\n" +
" myField1:boolean\n" +
" myField2:boolean\n");
CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
new WriteCommandAction.Simple(getProject()) {
@Override
public void run() {
protected void run() throws Throwable {
final int offset = document.getLineStartOffset(5);
document.insertString(offset, " boolean myNewField = false;\n");
}
}, null, null);
}.execute().throwException();
PsiDocumentManager.getInstance(myProject).commitDocument(document);
IdeaTestUtil.waitForAlarm(600);
PlatformTestUtil.waitForAlarm(600);
//TreeUtil.expand(structureViewComponent.getTree(), 3);
IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class1.java\n" +
" -Class1\n" + " getValue():int\n" +
" getClass():Class<? extends Object>\n" +
" hashCode():int\n" +
" equals(Object):boolean\n" +
" clone():Object\n" +
" toString():String\n" +
" notify():void\n" +
" notifyAll():void\n" +
" wait(long):void\n" +
" wait(long, int):void\n" +
" wait():void\n" +
" finalize():void\n" +
" myField1:boolean\n" +
" myField2:boolean\n" +
" myNewField:boolean = false\n");
PlatformTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class1.java\n" +
" -Class1\n" + " getValue():int\n" +
" getClass():Class<? extends Object>\n" +
" hashCode():int\n" +
" equals(Object):boolean\n" +
" clone():Object\n" +
" toString():String\n" +
" notify():void\n" +
" notifyAll():void\n" +
" wait(long):void\n" +
" wait(long, int):void\n" +
" wait():void\n" +
" finalize():void\n" +
" myField1:boolean\n" +
" myField2:boolean\n" +
" myNewField:boolean = false\n");
Disposer.dispose(structureViewComponent);
@@ -138,31 +137,31 @@ public class StructureViewUpdatingTest extends TestSourceBasedTestCase {
try {
structureViewComponent.setActionActive(InheritedMembersFilter.ID, true);
IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
" -Class2\n" +
" +InnerClass1\n" +
" +InnerClass2\n" +
" getValue():int\n" +
" myField1:boolean\n" +
" myField2:boolean\n" +
" myField3:boolean\n" +
" myField4:boolean\n");
PlatformTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
" -Class2\n" +
" +InnerClass1\n" +
" +InnerClass2\n" +
" getValue():int\n" +
" myField1:boolean\n" +
" myField2:boolean\n" +
" myField3:boolean\n" +
" myField4:boolean\n");
final PsiField innerClassField = psiClass.getInnerClasses()[0].getFields()[0];
structureViewComponent.select(innerClassField, true);
IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
" -Class2\n" +
" -InnerClass1\n" +
" +InnerClass12\n" +
" myInnerClassField:int\n" +
" +InnerClass2\n" +
" getValue():int\n" +
" myField1:boolean\n" +
" myField2:boolean\n" +
" myField3:boolean\n" +
" myField4:boolean\n");
PlatformTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
" -Class2\n" +
" -InnerClass1\n" +
" +InnerClass12\n" +
" myInnerClassField:int\n" +
" +InnerClass2\n" +
" getValue():int\n" +
" myField1:boolean\n" +
" myField2:boolean\n" +
" myField3:boolean\n" +
" myField4:boolean\n");
CommandProcessor.getInstance().executeCommand(myProject, new Runnable() {
@Override
@@ -175,25 +174,25 @@ public class StructureViewUpdatingTest extends TestSourceBasedTestCase {
innerClassField.delete();
}
catch (IncorrectOperationException e) {
assertTrue(e.getLocalizedMessage(), false);
fail(e.getLocalizedMessage());
}
}
});
}
}, null, null);
IdeaTestUtil.waitForAlarm(600);
PlatformTestUtil.waitForAlarm(600);
IdeaTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
" -Class2\n" +
" -InnerClass1\n" +
" +InnerClass12\n" +
" +InnerClass2\n" +
" getValue():int\n" +
" myField1:boolean\n" +
" myField2:boolean\n" +
" myField3:boolean\n" +
" myField4:boolean\n");
PlatformTestUtil.assertTreeEqual(structureViewComponent.getTree(), "-Class2.java\n" +
" -Class2\n" +
" -InnerClass1\n" +
" +InnerClass12\n" +
" +InnerClass2\n" +
" getValue():int\n" +
" myField1:boolean\n" +
" myField2:boolean\n" +
" myField3:boolean\n" +
" myField4:boolean\n");
}
finally {
@@ -213,26 +212,26 @@ public class StructureViewUpdatingTest extends TestSourceBasedTestCase {
(StructureViewComponent)fileEditor.getStructureViewBuilder().createStructureView(fileEditor, myProject);
final JTree tree = structureViewComponent.getTree();
IdeaTestUtil.assertTreeEqual(tree, "-test.xml\n" +
" -test\n" +
" +level1\n" +
" +level1\n" +
" +level1\n" +
" +level1\n");
PlatformTestUtil.assertTreeEqual(tree, "-test.xml\n" +
" -test\n" +
" +level1\n" +
" +level1\n" +
" +level1\n" +
" +level1\n");
tree.expandPath(tree.getPathForRow(3));
IdeaTestUtil.waitForAlarm(600);
PlatformTestUtil.waitForAlarm(600);
IdeaTestUtil.assertTreeEqual(tree,
"-test.xml\n" +
" -test\n" +
" +level1\n" +
" -level1\n" +
" +level2\n" +
" +level1\n" +
" +level1\n");
PlatformTestUtil.assertTreeEqual(tree,
"-test.xml\n" +
" -test\n" +
" +level1\n" +
" -level1\n" +
" +level2\n" +
" +level1\n" +
" +level1\n");
Disposer.dispose(structureViewComponent);
}
@@ -246,4 +245,9 @@ public class StructureViewUpdatingTest extends TestSourceBasedTestCase {
protected String getTestDataPath() {
return JavaTestUtil.getJavaTestDataPath();
}
@Override
protected boolean isRunInWriteAction() {
return false;
}
}
@@ -20,7 +20,6 @@ import com.intellij.pom.PomModel;
import com.intellij.pom.PomModelAspect;
import com.intellij.pom.event.PomChangeSet;
import com.intellij.pom.java.PomJavaAspect;
import com.intellij.psi.PsiFile;
import java.util.ArrayList;
import java.util.List;
@@ -28,22 +27,16 @@ import java.util.List;
public class PomJavaAspectChangeSet implements PomChangeSet{
private final PomModel myModel;
private final List<PomJavaChange> myChanges = new ArrayList<PomJavaChange>();
private final PsiFile myChangedFile;
public PomJavaAspectChangeSet(PomModel model, PsiFile fileChanged) {
public PomJavaAspectChangeSet(PomModel model) {
myModel = model;
myChangedFile = fileChanged;
}
public void addChange(PomJavaChange change) {
myChanges.add(change);
}
public List<PomJavaChange> getChanges() {
return myChanges;
}
public PomModelAspect getAspect() {
return myModel.getModelAspect(PomJavaAspect.class);
}
@@ -53,8 +46,4 @@ public class PomJavaAspectChangeSet implements PomChangeSet{
final PomJavaAspectChangeSet blockedJavaChange = (PomJavaAspectChangeSet)blocked;
myChanges.addAll(blockedJavaChange.myChanges);
}
public PsiFile getChangedFile() {
return myChangedFile;
}
}
@@ -16,15 +16,19 @@
package com.intellij.psi;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Function;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
/**
* User: anna
* Date: Jul 30, 2010
@@ -82,152 +86,218 @@ public class PsiDiamondType extends PsiType {
return new PsiType[]{getJavaLangObject(myManager, getResolveScope())};
}
public PsiType[] getInferredTypes() {
final PsiDeclarationStatement declarationStatement = PsiTreeUtil.getParentOfType(myTypeElement, PsiDeclarationStatement.class);
if (declarationStatement != null) {
final PsiElement[] declaredElements = declarationStatement.getDeclaredElements();
if (declaredElements.length > 0 && declaredElements[0] instanceof PsiVariable) {
return getComponentTypes((PsiVariable)declaredElements[0]);
}
public DiamondInferenceResult resolveInferredTypes() {
final PsiNewExpression newExpression = PsiTreeUtil.getParentOfType(myTypeElement, PsiNewExpression.class);
if (newExpression == null) {
return PsiDiamondType.DiamondInferenceResult.NULL_RESULT;
}
final PsiAssignmentExpression assignmentExpression = PsiTreeUtil.getParentOfType(myTypeElement, PsiAssignmentExpression.class);
if (assignmentExpression != null) {
final PsiExpression lExpression = assignmentExpression.getLExpression();
if (lExpression instanceof PsiReferenceExpression) {
final PsiElement resolved = ((PsiReferenceExpression)lExpression).resolve();
if (resolved instanceof PsiVariable) {
return getComponentTypes(((PsiVariable)resolved));
}
}
}
PsiExpression psiExpression = PsiTreeUtil.getParentOfType(myTypeElement, PsiExpression.class);
while (psiExpression != null) {
final PsiElement parent = psiExpression.getParent();
if (parent instanceof PsiExpression) {
psiExpression = (PsiExpression)parent;
continue;
}
break;
}
if (psiExpression != null) {
final PsiElement parent = psiExpression.getParent();
if (parent instanceof PsiExpressionList) {
final PsiElement parentParent = parent.getParent();
if (parentParent instanceof PsiCallExpression) {
final JavaResolveResult resolveResult = ((PsiCallExpression)parentParent).resolveMethodGenerics();
final PsiSubstitutor substitutor = resolveResult.getSubstitutor();
final PsiElement element = resolveResult.getElement();
if (element instanceof PsiMethod) {
final int paramIdx = ArrayUtil.find(((PsiExpressionList)parent).getExpressions(), psiExpression);
if (paramIdx > -1) {
final PsiParameter parameter =
((PsiMethod)element).getParameterList().getParameters()[paramIdx];
return getComponentTypes(substitutor.substitute(parameter.getType()));
}
}
}
} else if (parent instanceof PsiVariable) {
return getComponentTypes((PsiVariable)parent);
} else if (parent instanceof PsiReturnStatement) {
final PsiMethod containingMethod = PsiTreeUtil.getParentOfType(parent, PsiMethod.class);
if (containingMethod != null) {
final PsiType returnType = containingMethod.getReturnType();
if (returnType != null) {
final PsiExpression returnValue = ((PsiReturnStatement)parent).getReturnValue();
if (returnValue instanceof PsiNewExpression) {
return getComponentTypes(returnType, returnValue);
}
return getComponentTypes(returnType);
}
}
}
}
return NULL_TYPES;
return resolveInferredTypes(newExpression);
}
private static PsiType[] getComponentTypes(PsiVariable declaredElement) {
final PsiType lType = declaredElement.getType();
final PsiExpression initializer = declaredElement.getInitializer();
return getComponentTypes(lType, initializer);
}
private static PsiType[] getComponentTypes(PsiType lType, PsiExpression initializer) {
if (initializer instanceof PsiNewExpression) {
final PsiNewExpression newExpression = (PsiNewExpression)initializer;
final PsiJavaCodeReferenceElement classReference = newExpression.getClassOrAnonymousClassReference();
if (classReference != null) {
final String text = classReference.getReferenceName();
if (text != null) {
final PsiClass psiClass =
JavaPsiFacade.getInstance(initializer.getProject()).getResolveHelper().resolveReferencedClass(text, initializer);
final PsiType substitute = substitute(psiClass, lType);
if (substitute != null) {
lType = substitute;
}
public static DiamondInferenceResult resolveInferredTypes(PsiNewExpression newExpression) {
final PsiClass psiClass = findClass(newExpression);
if (psiClass == null) return DiamondInferenceResult.NULL_RESULT;
final PsiExpressionList argumentList = newExpression.getArgumentList();
if (argumentList == null) return DiamondInferenceResult.NULL_RESULT;
final PsiMethod constructor = findConstructor(psiClass, newExpression);
PsiTypeParameter[] params = getAllTypeParams(constructor, psiClass);
PsiMethod staticFactory = generateStaticFactory(constructor, psiClass, params);
if (staticFactory == null) {
return DiamondInferenceResult.NULL_RESULT;
}
final PsiSubstitutor inferredSubstitutor = inferTypeParametersForStaticFactory(staticFactory, newExpression);
final PsiTypeParameter[] parameters = staticFactory.getTypeParameters();
final PsiTypeParameter[] classParameters = psiClass.getTypeParameters();
final PsiJavaCodeReferenceElement classOrAnonymousClassReference = newExpression.getClassOrAnonymousClassReference();
LOG.assertTrue(classOrAnonymousClassReference != null);
final DiamondInferenceResult result = new DiamondInferenceResult(classOrAnonymousClassReference.getReferenceName() + "<>");
for (PsiTypeParameter parameter : parameters) {
for (PsiTypeParameter classParameter : classParameters) {
if (Comparing.strEqual(classParameter.getName(), parameter.getName())) {
result.addInferredType(inferredSubstitutor.substitute(parameter));
break;
}
}
}
return getComponentTypes(lType);
return result;
}
@Nullable
private static PsiMethod findConstructor(PsiClass containingClass, PsiNewExpression newExpression) {
final PsiExpressionList argumentList = newExpression.getArgumentList();
final Project project = newExpression.getProject();
final JavaPsiFacade facade = JavaPsiFacade.getInstance(project);
final PsiResolveHelper resolveHelper = facade.getResolveHelper();
final JavaResolveResult result =
resolveHelper.resolveConstructor(facade.getElementFactory().createType(containingClass), argumentList, argumentList);
return (PsiMethod)result.getElement();
}
@Nullable
private static PsiType substitute(PsiClass inheritor, PsiType baseType) {
if (inheritor == null) return null;
final JavaPsiFacade facade = JavaPsiFacade.getInstance(inheritor.getProject());
final PsiResolveHelper resolveHelper = facade.getResolveHelper();
final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(baseType);
final PsiClass baseClass = resolveResult.getElement();
if (baseClass == null) return null;
PsiSubstitutor superSubstitutor = TypeConversionUtil.getClassSubstitutor(baseClass, inheritor, PsiSubstitutor.EMPTY);
if (superSubstitutor == null) return null;
final PsiSubstitutor baseSubstitutor = resolveResult.getSubstitutor();
PsiSubstitutor inheritorSubstitutor = PsiSubstitutor.EMPTY;
for (PsiTypeParameter inheritorParameter : PsiUtil.typeParametersIterable(inheritor)) {
for (PsiTypeParameter baseParameter : PsiUtil.typeParametersIterable(baseClass)) {
final PsiType substituted = superSubstitutor.substitute(baseParameter);
PsiType arg = baseSubstitutor.substitute(baseParameter);
if (arg instanceof PsiWildcardType) arg = ((PsiWildcardType)arg).getExtendsBound();
PsiType substitution = resolveHelper.getSubstitutionForTypeParameter(inheritorParameter,
substituted,
arg,
true,
PsiUtil.getLanguageLevel(inheritor));
if (PsiType.NULL.equals(substitution) || substitution instanceof PsiWildcardType) continue;
if (substitution == null) {
continue;
}
inheritorSubstitutor = inheritorSubstitutor.put(inheritorParameter, substitution);
break;
private static PsiClass findClass(PsiNewExpression newExpression) {
final PsiJavaCodeReferenceElement classReference = newExpression.getClassOrAnonymousClassReference();
if (classReference != null) {
final String text = classReference.getReferenceName();
if (text != null) {
final Project project = newExpression.getProject();
final JavaPsiFacade facade = JavaPsiFacade.getInstance(project);
final PsiResolveHelper resolveHelper = facade.getResolveHelper();
return resolveHelper.resolveReferencedClass(text, newExpression);
} else {
return null;
}
}
PsiType toAdd = facade.getElementFactory().createType(inheritor, inheritorSubstitutor);
if (baseType.isAssignableFrom(toAdd)) {
return toAdd;
}
return null;
}
private static PsiType[] getComponentTypes(PsiType type) {
if (type instanceof PsiClassType) {
final PsiType[] types = ((PsiClassType)type).getParameters();
for (int i = 0; i < types.length; i++) {
PsiType currentType = types[i];
if (currentType instanceof PsiWildcardType) {
final PsiType bound = ((PsiWildcardType)currentType).getBound();
if (bound != null) {
types[i] = bound;
}
}
@Nullable
private static PsiMethod generateStaticFactory(@Nullable PsiMethod constructor, PsiClass containingClass, PsiTypeParameter[] params) {
final StringBuilder buf = new StringBuilder();
buf.append("public static ");
buf.append("<");
buf.append(StringUtil.join(params, new Function<PsiTypeParameter, String>() {
@Override
public String fun(PsiTypeParameter psiTypeParameter) {
return psiTypeParameter.getName();
}
return types;
}, ", "));
buf.append(">");
final String qualifiedName = containingClass.getQualifiedName();
buf.append(qualifiedName != null ? qualifiedName : containingClass.getName());
final PsiTypeParameter[] parameters = containingClass.getTypeParameters();
buf.append("<");
buf.append(StringUtil.join(parameters, new Function<PsiTypeParameter, String>() {
@Override
public String fun(PsiTypeParameter psiTypeParameter) {
return psiTypeParameter.getName();
}
}, ", "));
buf.append("> ");
String staticFactoryName = "staticFactory";
final JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(containingClass.getProject());
staticFactoryName = styleManager.suggestUniqueVariableName(staticFactoryName, containingClass, false);
buf.append(staticFactoryName);
if (constructor == null) {
buf.append("()");
}
else {
buf.append("(").append(StringUtil.join(constructor.getParameterList().getParameters(), new Function<PsiParameter, String>() {
@Override
public String fun(PsiParameter psiParameter) {
return psiParameter.getType().getCanonicalText() + " " + psiParameter.getName();
}
}, ",")).append(")");
}
buf.append("{}");
return JavaPsiFacade.getElementFactory(containingClass.getProject()).createMethodFromText(buf.toString(), constructor != null ? constructor : containingClass);
}
private static PsiTypeParameter[] getAllTypeParams(PsiTypeParameterListOwner listOwner, PsiClass containingClass) {
Set<PsiTypeParameter> params = new LinkedHashSet<PsiTypeParameter>();
if (listOwner != null) {
Collections.addAll(params, listOwner.getTypeParameters());
}
Collections.addAll(params, containingClass.getTypeParameters());
return params.toArray(new PsiTypeParameter[params.size()]);
}
private static PsiSubstitutor inferTypeParametersForStaticFactory(@NotNull PsiMethod staticFactoryMethod,
PsiNewExpression expression) {
final JavaPsiFacade facade = JavaPsiFacade.getInstance(staticFactoryMethod.getProject());
final PsiResolveHelper resolveHelper = facade.getResolveHelper();
final PsiParameter[] parameters = staticFactoryMethod.getParameterList().getParameters();
final PsiExpressionList argumentList = expression.getArgumentList();
final PsiExpression[] expressions = argumentList.getExpressions();
return resolveHelper
.inferTypeArguments(staticFactoryMethod.getTypeParameters(), parameters, expressions, PsiSubstitutor.EMPTY, expression, false);
}
public static class DiamondInferenceResult {
public static final DiamondInferenceResult NULL_RESULT = new DiamondInferenceResult() {
@Override
public PsiType[] getTypes() {
return NULL_TYPES;
}
@Override
public String getErrorMessage() {
return "Cannot infer arguments";
}
};
private List<PsiType> myInferredTypes = new ArrayList<PsiType>();
private String myErrorMessage;
private String myNewExpressionPresentableText;
public DiamondInferenceResult() {
}
public DiamondInferenceResult(String expressionPresentableText) {
myNewExpressionPresentableText = expressionPresentableText;
}
public PsiType[] getTypes() {
if (myErrorMessage != null) {
return NULL_TYPES;
}
return myInferredTypes.toArray(new PsiType[myInferredTypes.size()]);
}
public String getErrorMessage() {
return myErrorMessage;
}
public void addInferredType(PsiType psiType) {
if (myErrorMessage != null) return;
if (psiType == null) {
myErrorMessage = "Cannot infer type arguments for " + myNewExpressionPresentableText;
} else if (!isValid(psiType)) {
myErrorMessage = "Cannot infer type arguments for " +
myNewExpressionPresentableText + " because type " + psiType.getPresentableText() + " inferred is not allowed in current context";
} else {
myInferredTypes.add(psiType);
}
}
private static Boolean isValid(PsiType type) {
return type.accept(new PsiTypeVisitor<Boolean>() {
@Override
public Boolean visitType(PsiType type) {
return !(type instanceof PsiIntersectionType);
}
@Override
public Boolean visitCapturedWildcardType(PsiCapturedWildcardType capturedWildcardType) {
return false;
}
@Override
public Boolean visitWildcardType(PsiWildcardType wildcardType) {
final PsiType bound = wildcardType.getBound();
if (bound != null) {
if (bound instanceof PsiIntersectionType) return false;
return bound.accept(this);
}
return true;
}
@Override
public Boolean visitClassType(PsiClassType classType) {
for (PsiType psiType : classType.getParameters()) {
if (!psiType.accept(this)) {
return false;
}
}
return true;
}
});
}
return NULL_TYPES;
}
}
@@ -25,8 +25,6 @@ import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode;
import com.intellij.ide.util.treeView.*;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.project.DumbAwareRunnable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.impl.JavaSdkImpl;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.ui.Queryable;
import com.intellij.openapi.util.Disposer;
@@ -300,4 +298,9 @@ public abstract class BaseProjectViewTestCase extends TestSourceBasedTestCase {
protected String getTestDataPath() {
return PathManagerEx.getTestDataPath(getClass());
}
@Override
protected boolean isRunInWriteAction() {
return false;
}
}
@@ -239,11 +239,10 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler {
@NotNull
private LookupImpl obtainLookup(Editor editor) {
LookupImpl existing = (LookupImpl)LookupManager.getActiveLookup(editor);
if (existing != null && existing.isCompletion()) {
if (existing != null && existing.isCompletion() && !existing.isHintMode()) {
existing.markReused();
if (!autopopup) {
existing.setFocused(true);
existing.setHintMode(false);
}
return existing;
}
@@ -17,6 +17,7 @@
package com.intellij.codeInsight.lookup.impl;
import com.intellij.codeInsight.lookup.LookupManager;
import com.intellij.ide.ui.UISettings;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
@@ -73,11 +74,6 @@ public abstract class LookupActionHandler extends EditorActionHandler {
protected void executeInLookup(final LookupImpl lookup, DataContext context) {
if (!lookup.isFocused()) {
if (lookup.isPositionedAboveCaret()) {
myOriginalHandler.execute(lookup.getEditor(), context);
return;
}
lookup.setFocused(true);
lookup.getList().setSelectedIndex(0);
lookup.refreshUi();
@@ -94,16 +90,14 @@ public abstract class LookupActionHandler extends EditorActionHandler {
protected void executeInLookup(final LookupImpl lookup, DataContext context) {
if (!lookup.isFocused()) {
if (!lookup.isPositionedAboveCaret()) {
if (!UISettings.getInstance().CYCLE_SCROLLING) {
myOriginalHandler.execute(lookup.getEditor(), context);
return;
}
lookup.setFocused(true);
final int index = ApplicationManager.getApplication().isUnitTestMode() ? lookup.getItems().size() - 1 : lookup.getList().getLastVisibleIndex();
lookup.getList().setSelectedIndex(index);
lookup.getList().setSelectedIndex(0);
lookup.refreshUi();
return;
}
ListScrollingUtil.moveUp(lookup.getList(), 0);
}
@@ -311,7 +311,7 @@ public class FileTemplateUtil{
final Properties finalProps = props;
CommandProcessor.getInstance().executeCommand(project, new Runnable(){
public void run(){
final Runnable run = new Runnable(){
ApplicationManager.getApplication().runWriteAction(new Runnable(){
public void run(){
try{
CreateFromTemplateHandler handler = findHandler(template);
@@ -321,8 +321,7 @@ public class FileTemplateUtil{
commandException[0] = ex;
}
}
};
ApplicationManager.getApplication().runWriteAction(run);
});
}
}, template.isJavaClassTemplate()
? IdeBundle.message("command.create.class.from.template")
@@ -102,8 +102,9 @@ public class FileBasedIndex implements ApplicationComponent {
private final Set<FileType> myNoLimitCheckTypes = new HashSet<FileType>();
private final PerIndexDocumentMap<Long> myLastIndexedDocStamps = new PerIndexDocumentMap<Long>() {
@NotNull
@Override
protected Long createDefault(Document document) {
protected Long createDefault(@NotNull Document document) {
return 0L;
}
};
@@ -1161,7 +1162,7 @@ public class FileBasedIndex implements ApplicationComponent {
}
// returns false if doc was not indexed because the file does not fit in scope
private boolean indexUnsavedDocument(final Document document, final ID<?, ?> requestedIndexId, final Project project, GlobalSearchScope filter) throws StorageException {
private boolean indexUnsavedDocument(@NotNull final Document document, @NotNull final ID<?, ?> requestedIndexId, final Project project, GlobalSearchScope filter) throws StorageException {
final VirtualFile vFile = myFileDocumentManager.getFile(document);
if (!(vFile instanceof VirtualFileWithId) || !vFile.isValid()) {
return true;
@@ -1253,9 +1254,7 @@ public class FileBasedIndex implements ApplicationComponent {
}
private void cleanupMemoryStorage() {
synchronized (myLastIndexedDocStamps) {
myLastIndexedDocStamps.clear();
}
myLastIndexedDocStamps.clear();
for (ID<?, ?> indexId : myIndices.keySet()) {
final MapReduceIndex index = (MapReduceIndex)getIndex(indexId);
assert index != null;
@@ -86,7 +86,7 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
}
public boolean hasNodesToUpdate() {
return myNodeQueue.size() > 0 || !myUpdateQueue.isEmpty();
return !myNodeQueue.isEmpty() || !myUpdateQueue.isEmpty();
}
public void dispose() {
@@ -114,15 +114,15 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
toAdd.expire();
break;
}
else if (passInQueue.getNode() == toAdd.getNode()) {
if (passInQueue.getNode() == toAdd.getNode()) {
toAdd.expire();
break;
}
else if (toAdd.getNode().isNodeAncestor(passInQueue.getNode())) {
if (toAdd.getNode().isNodeAncestor(passInQueue.getNode())) {
toAdd.expire();
break;
}
else if (passInQueue.getNode().isNodeAncestor(toAdd.getNode())) {
if (passInQueue.getNode().isNodeAncestor(toAdd.getNode())) {
iterator.remove();
passInQueue.expire();
}
@@ -133,9 +133,7 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
if (!toAdd.isExpired()) {
final Collection<TreeUpdatePass> yielding = ui.getYeildingPasses();
for (Iterator<TreeUpdatePass> iterator = yielding.iterator(); iterator.hasNext();) {
TreeUpdatePass eachYielding = iterator.next();
for (TreeUpdatePass eachYielding : yielding) {
final DefaultMutableTreeNode eachNode = eachYielding.getCurrentNode();
if (eachNode != null) {
if (eachNode.isNodeAncestor(toAdd.getNode())) {
@@ -228,8 +226,7 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
try {
myTreeBuilder.getUi().updateSubtreeNow(eachPass, false);
}
catch (ProcessCanceledException e) {
return;
catch (ProcessCanceledException ignored) {
}
}
});
@@ -348,10 +345,8 @@ public class AbstractTreeUpdater implements Disposable, Activatable {
}
public boolean isEnqueuedToUpdate(DefaultMutableTreeNode node) {
Iterator<TreeUpdatePass> nodes = myNodeQueue.iterator();
while (nodes.hasNext()) {
TreeUpdatePass each = nodes.next();
if (each.willUpdate(node)) return true;
for (TreeUpdatePass pass : myNodeQueue) {
if (pass.willUpdate(node)) return true;
}
return false;
}
@@ -123,8 +123,7 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
try {
each.setRejected();
}
catch (ProcessCanceledException e) {
continue;
catch (ProcessCanceledException ignored) {
}
}
myScheduledUpdates.clear();
@@ -237,7 +236,7 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
}
};
if (myExecuteInDispatchThread && invokeLaterIfNotDispatch && !ApplicationManager.getApplication().isDispatchThread()) {
if (myExecuteInDispatchThread && invokeLaterIfNotDispatch) {
UIUtil.invokeLaterIfNeeded(toRun);
}
else {
@@ -394,7 +393,7 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable {
public boolean isEmpty() {
synchronized (myScheduledUpdates) {
return myScheduledUpdates.size() == 0;
return myScheduledUpdates.isEmpty();
}
}
@@ -365,7 +365,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
EditorSettings editorSettings = myEditor.getSettings();
if (!editorSettings.isVirtualSpace() && line < lineCount) {
if (!editorSettings.isVirtualSpace() && line < lineCount && !myEditor.getSelectionModel().hasBlockSelection()) {
int lineEndOffset = doc.getLineEndOffset(line);
int lineEndColumnNumber = myEditor.offsetToLogicalPosition(lineEndOffset).column;
if (column > lineEndColumnNumber) {
@@ -765,6 +765,9 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
int oldFontSize = myScheme.getEditorFontSize();
myScheme.setEditorFontSize(fontSize);
myPropertyChangeSupport.firePropertyChange(PROP_FONT_SIZE, oldFontSize, fontSize);
// Update vertical scroll bar bounds if necessary (we had a problem that use increased editor font size and it was not possible
// to scroll to the bottom of the document).
myScrollPane.getViewport().invalidate();
}
public ActionCallback type(final String text) {
@@ -3255,7 +3258,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
return;
}
if (!mySettings.isVirtualSpace()) {
if (!mySettings.isVirtualSpace() && !mySelectionModel.hasBlockSelection()) {
int lineEndOffset = myDocument.getLineEndOffset(lineNumber);
int lineEndColumnNumber = calcColumnNumber(lineEndOffset, lineNumber);
if (columnNumber > lineEndColumnNumber) {
@@ -24,6 +24,7 @@
*/
package com.intellij.openapi.editor.impl;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.ex.MarkupModelEx;
@@ -54,11 +55,13 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
private final RangeHighlighterTree myHighlighterTree;
MarkupModelImpl(DocumentImpl document) {
ApplicationManager.getApplication().assertIsDispatchThread();
myDocument = document;
myHighlighterTree = new RangeHighlighterTree(myDocument);
}
public void dispose() {
ApplicationManager.getApplication().assertIsDispatchThread();
myHighlighterTree.dispose();
}
@@ -98,9 +101,11 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
@NotNull
public RangeHighlighter[] getAllHighlighters() {
ApplicationManager.getApplication().assertIsDispatchThread();
if (myCachedHighlighters == null) {
if (myHighlighterTree.size() == 0) return RangeHighlighter.EMPTY_ARRAY;
List<RangeHighlighterEx> list = new ArrayList<RangeHighlighterEx>();
int size = myHighlighterTree.size();
if (size == 0) return RangeHighlighter.EMPTY_ARRAY;
List<RangeHighlighterEx> list = new ArrayList<RangeHighlighterEx>(size);
myHighlighterTree.process(new CommonProcessors.CollectProcessor<RangeHighlighterEx>(list));
myCachedHighlighters = list.toArray(new RangeHighlighter[list.size()]);
}
@@ -115,6 +120,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
@NotNull HighlighterTargetArea targetArea,
boolean isPersistent,
@Nullable Consumer<RangeHighlighterEx> changeAttributesAction) {
ApplicationManager.getApplication().assertIsDispatchThread();
RangeHighlighterEx highlighter = isPersistent
? new PersistentRangeHighlighterImpl(this, startOffset, layer, targetArea, textAttributes)
: new RangeHighlighterImpl(this, startOffset, endOffset, layer, targetArea, textAttributes);
@@ -134,6 +140,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
@Override
public void changeAttributesInBatch(@NotNull RangeHighlighterEx highlighter, @NotNull Consumer<RangeHighlighterEx> changeAttributesAction) {
ApplicationManager.getApplication().assertIsDispatchThread();
boolean changed = highlighter instanceof PersistentRangeHighlighterImpl
? ((PersistentRangeHighlighterImpl)highlighter).changeAttributesInBatch(changeAttributesAction)
: ((RangeHighlighterImpl)highlighter).changeAttributesInBatch(changeAttributesAction);
@@ -143,6 +150,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
}
void addRangeHighlighter(RangeHighlighterEx marker, int start, int end, RangeHighlighterData data) {
ApplicationManager.getApplication().assertIsDispatchThread();
myHighlighterTree.addInterval(marker, start, end, data);
}
@@ -156,6 +164,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
}
public void removeHighlighter(@NotNull RangeHighlighter segmentHighlighter) {
ApplicationManager.getApplication().assertIsDispatchThread();
myCachedHighlighters = null;
if (!segmentHighlighter.isValid()) return;
@@ -166,6 +175,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
}
public void removeAllHighlighters() {
ApplicationManager.getApplication().assertIsDispatchThread();
myHighlighterTree.process(new Processor<RangeMarkerEx>() {
public boolean process(RangeMarkerEx rangeMarkerEx) {
fireBeforeRemoved((RangeHighlighterEx)rangeMarkerEx);
@@ -191,6 +201,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
}
public void setRangeHighlighterAttributes(@NotNull final RangeHighlighter highlighter, final TextAttributes textAttributes) {
ApplicationManager.getApplication().assertIsDispatchThread();
((RangeHighlighterImpl)highlighter).setTextAttributes(textAttributes);
}
@@ -211,6 +222,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
}
public boolean containsHighlighter(@NotNull final RangeHighlighter highlighter) {
ApplicationManager.getApplication().assertIsDispatchThread();
return !myHighlighterTree.processOverlappingWith(highlighter.getStartOffset(), highlighter.getEndOffset(), new Processor<RangeHighlighterEx>() {
public boolean process(RangeHighlighterEx h) {
return h.getId() != ((RangeHighlighterEx)highlighter).getId();
@@ -236,6 +248,7 @@ public class MarkupModelImpl extends UserDataHolderBase implements MarkupModelEx
}
public void normalize() {
ApplicationManager.getApplication().assertIsDispatchThread();
myHighlighterTree.normalize();
}
}
@@ -15,7 +15,8 @@
*/
package com.intellij.testFramework;
import com.intellij.ide.*;
import com.intellij.ide.DataManager;
import com.intellij.ide.IdeEventQueue;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.ide.util.treeView.AbstractTreeStructure;
import com.intellij.idea.Bombed;
@@ -48,9 +49,10 @@ import org.jetbrains.annotations.TestOnly;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import java.util.*;
import java.awt.*;
import java.awt.event.InvocationEvent;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
/**
@@ -99,14 +101,14 @@ public class PlatformTestUtil {
}
public static String print(JTree tree, boolean withSelection, Condition<String> nodePrintCondition) {
StringBuffer buffer = new StringBuffer();
StringBuilder buffer = new StringBuilder();
Object root = tree.getModel().getRoot();
printImpl(tree, root, buffer, 0, withSelection, nodePrintCondition);
return buffer.toString();
}
private static void printImpl(JTree tree, Object root, StringBuffer buffer, int level, boolean withSelection, @Nullable Condition<String> nodePrintCondition) {
private static void printImpl(JTree tree, Object root, StringBuilder buffer, int level, boolean withSelection, @Nullable Condition<String> nodePrintCondition) {
DefaultMutableTreeNode defaultMutableTreeNode = (DefaultMutableTreeNode)root;
@@ -116,7 +118,7 @@ public class PlatformTestUtil {
nodeText = toString(userObject, null);
}
else {
nodeText = defaultMutableTreeNode + "";
nodeText = String.valueOf(defaultMutableTreeNode);
}
@@ -163,8 +165,10 @@ public class PlatformTestUtil {
Assert.assertEquals(expected, treeStringPresentation);
}
@TestOnly
public static void waitForAlarm(final int delay) throws InterruptedException {
final boolean[] invoked = new boolean[]{false};
assert !ApplicationManager.getApplication().isWriteAccessAllowed(): "It's a bad idea to wait for an alarm under the write action. Somebody creates an alarm which requires read action and you are deadlocked.";
final AtomicBoolean invoked = new AtomicBoolean();
final Alarm alarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD);
alarm.addRequest(new Runnable() {
@Override
@@ -175,7 +179,7 @@ public class PlatformTestUtil {
alarm.addRequest(new Runnable() {
@Override
public void run() {
invoked[0] = true;
invoked.set(true);
}
}, delay);
}
@@ -185,10 +189,13 @@ public class PlatformTestUtil {
UIUtil.dispatchAllInvocationEvents();
while (!invoked[0]) {
boolean sleptAlready = false;
while (!invoked.get()) {
UIUtil.dispatchAllInvocationEvents();
Thread.sleep(delay);
Thread.sleep(sleptAlready ? 10 : delay);
sleptAlready = true;
}
UIUtil.dispatchAllInvocationEvents();
}
@TestOnly
@@ -105,7 +105,10 @@ public class GroupNode extends Node implements Navigatable, Comparable<GroupNode
MergeableUsage mergeableUsage = (MergeableUsage)usage;
for (UsageNode node : myUsageNodes) {
Usage original = node.getUsage();
assert original != mergeableUsage : "Double add: " + usage +"; node: "+ node+"; already added: "+myUsageNodes;
if (original == mergeableUsage) {
// search returned duplicate usage, ignore
return node;
}
if (original instanceof MergeableUsage) {
if (((MergeableUsage)original).merge(mergeableUsage)) return node;
}
@@ -52,7 +52,7 @@ public class TransferToEDTQueue<T> {
T thing = myQueue.poll();
if (thing == null) break;
if (!myProcessor.process(thing)) {
myQueue.clear();
stop();
return;
}
processed++;
@@ -15,10 +15,12 @@
*/
package com.intellij.platform;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ProjectComponent;
import com.intellij.openapi.project.DumbAwareRunnable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vcs.VcsDirectoryMapping;
import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl;
@@ -42,7 +44,7 @@ public class PlatformVcsDetector implements ProjectComponent {
public void projectOpened() {
StartupManager.getInstance(myProject).runWhenProjectIsInitialized(new DumbAwareRunnable() {
public void run() {
AppUIUtil.invokeLaterIfProjectAlive(myProject, new DumbAwareRunnable() {
final DumbAwareRunnable runnable = new DumbAwareRunnable() {
@Override
public void run() {
VirtualFile file = ProjectBaseDirectory.getInstance(myProject).getBaseDir(myProject.getBaseDir());
@@ -56,6 +58,12 @@ public class PlatformVcsDetector implements ProjectComponent {
}
}
}
};
ApplicationManager.getApplication().invokeLater(runnable, new Condition() {
@Override
public boolean value(Object o) {
return (! myProject.isOpen()) || myProject.isDisposed();
}
});
}
});
@@ -61,7 +61,7 @@ public class GroovyGenerationInfo<T extends PsiMember> extends PsiGenerationInfo
}
final IElementType type = element.getNode().getElementType();
if (GroovyTokenTypes.WHITE_SPACES_SET.contains(type)) {
if (type == GroovyTokenTypes.mNLS || type == GroovyTokenTypes.mWS) {
return element.getNextSibling();
}
@@ -520,8 +520,8 @@ public class ResolveUtil {
return resolveResult != null && isInUseScope(resolveResult.getCurrentFileResolveContext());
}
public static boolean isInUseScope(PsiElement context) {
if (context instanceof GrMethodCall) {
public static boolean isInUseScope(@Nullable PsiElement context) {
if (context instanceof GrMethodCall && context.isValid()) {
final GrExpression expression = ((GrMethodCall)context).getInvokedExpression();
if (expression instanceof GrReferenceExpression) {
final PsiElement resolved = ((GrReferenceExpression)expression).resolve();
@@ -48,20 +48,20 @@ public class BreadcrumbsLoaderComponent extends AbstractProjectComponent {
return webEditorOptions.isBreadcrumbsEnabled() || webEditorOptions.isBreadcrumbsEnabledInXml();
}
private static class MyFileEditorManagerListener implements FileEditorManagerListener {
private static class MyFileEditorManagerListener extends FileEditorManagerAdapter {
public void fileOpened(final FileEditorManager source, final VirtualFile file) {
if (isEnabled() && isSuitable(source.getProject(), file)) {
final FileEditor[] fileEditors = source.getEditors(file);
for (final FileEditor each : fileEditors) {
if (each instanceof TextEditor) {
final BreadcrumbsXmlWrapper wrapper = new BreadcrumbsXmlWrapper(((TextEditor)each).getEditor());
for (final FileEditor fileEditor : fileEditors) {
if (fileEditor instanceof TextEditor) {
final BreadcrumbsXmlWrapper wrapper = new BreadcrumbsXmlWrapper(((TextEditor)fileEditor).getEditor());
final JComponent c = wrapper.getComponent();
source.addTopComponent(each, c);
source.addTopComponent(fileEditor, c);
Disposer.register(each, wrapper);
Disposer.register(each, new Disposable() {
Disposer.register(fileEditor, wrapper);
Disposer.register(fileEditor, new Disposable() {
public void dispose() {
source.removeTopComponent(each, c);
source.removeTopComponent(fileEditor, c);
}
});
}
@@ -74,11 +74,11 @@ public class BreadcrumbsLoaderComponent extends AbstractProjectComponent {
return false;
}
final FileViewProvider psiFile = PsiManager.getInstance(project).findViewProvider(file);
final FileViewProvider provider = PsiManager.getInstance(project).findViewProvider(file);
return psiFile != null
&& hasNonEmptyHtml(psiFile)
&& BreadcrumbsXmlWrapper.findInfoProvider(psiFile) != null;
return provider != null
&& hasNonEmptyHtml(provider)
&& BreadcrumbsXmlWrapper.findInfoProvider(provider) != null;
}
public static boolean hasNonEmptyHtml(FileViewProvider viewProvider) {
@@ -94,11 +94,5 @@ public class BreadcrumbsLoaderComponent extends AbstractProjectComponent {
}
return false;
}
public void fileClosed(final FileEditorManager source, final VirtualFile file) {
}
public void selectionChanged(final FileEditorManagerEvent event) {
}
}
}
@@ -34,13 +34,6 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vcs.FileStatusListener;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.PomManager;
import com.intellij.pom.PomModelAspect;
import com.intellij.pom.event.PomChangeSet;
import com.intellij.pom.event.PomModelEvent;
import com.intellij.pom.event.PomModelListener;
import com.intellij.pom.xml.XmlAspect;
import com.intellij.pom.xml.XmlChangeSet;
import com.intellij.psi.*;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.update.MergingUpdateQueue;
@@ -103,8 +96,7 @@ public class BreadcrumbsXmlWrapper implements BreadcrumbsItemListener<Breadcrumb
final CaretListener caretListener = new CaretListener() {
public void caretPositionChanged(final CaretEvent e) {
if (myUserCaretChange) {
myQueue.cancelAllUpdates();
myQueue.queue(new MyUpdate(BreadcrumbsXmlWrapper.this, editor));
queueUpdate(editor);
}
myUserCaretChange = true;
@@ -118,19 +110,40 @@ public class BreadcrumbsXmlWrapper implements BreadcrumbsItemListener<Breadcrumb
}
});
PomManager.getModel(project).addModelListener(new PomModelListener() {
public void modelChanged(final PomModelEvent event) {
final PomChangeSet set = event.getChangeSet(event.getSource().getModelAspect(XmlAspect.class));
if (set instanceof XmlChangeSet && myQueue != null) {
myQueue.cancelAllUpdates();
myQueue.queue(new MyUpdate(BreadcrumbsXmlWrapper.this, editor));
}
PsiManager.getInstance(project).addPsiTreeChangeListener(new PsiTreeChangeAdapter() {
@Override
public void propertyChanged(PsiTreeChangeEvent event) {
PsiFile psiFile = event.getFile();
VirtualFile file = psiFile == null ? null : psiFile.getVirtualFile();
if (file != myFile) return;
queueUpdate(editor);
}
public boolean isAspectChangeInteresting(final PomModelAspect aspect) {
return aspect instanceof XmlAspect;
@Override
public void childrenChanged(PsiTreeChangeEvent event) {
propertyChanged(event);
}
}, this);
@Override
public void childMoved(PsiTreeChangeEvent event) {
propertyChanged(event);
}
@Override
public void childReplaced(PsiTreeChangeEvent event) {
propertyChanged(event);
}
@Override
public void childRemoved(PsiTreeChangeEvent event) {
propertyChanged(event);
}
@Override
public void childAdded(PsiTreeChangeEvent event) {
propertyChanged(event);
}
},this);
myComponent = new BreadcrumbsComponent<BreadcrumbsPsiItem>();
myComponent.addBreadcrumbsItemListener(this);
@@ -140,8 +153,7 @@ public class BreadcrumbsXmlWrapper implements BreadcrumbsItemListener<Breadcrumb
final ComponentAdapter resizeListener = new ComponentAdapter() {
public void componentResized(final ComponentEvent e) {
myQueue.cancelAllUpdates();
myQueue.queue(new MyUpdate(BreadcrumbsXmlWrapper.this, editor));
queueUpdate(editor);
}
};
@@ -166,6 +178,11 @@ public class BreadcrumbsXmlWrapper implements BreadcrumbsItemListener<Breadcrumb
myWrapperPanel.add(myComponent, BorderLayout.CENTER);
}
private void queueUpdate(Editor editor) {
myQueue.cancelAllUpdates();
myQueue.queue(new MyUpdate(this, editor));
}
private void moveEditorCaretTo(@NotNull final PsiElement element) {
if (element.isValid()) {
setUserCaretChange(false);