Snapshot e242282deb41c328afbe971fc167e47ddfb26df9 from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: Ifdc1818cde7b63f6d7bf42801f18c7f1557b8d85
diff --git a/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java b/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java
index bb59707..3ed3747 100644
--- a/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java
+++ b/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java
@@ -15,8 +15,8 @@
*/
package com.intellij.compiler.actions;
-import org.jetbrains.jps.model.java.compiler.AnnotationProcessingConfiguration;
import com.intellij.compiler.CompilerConfiguration;
+import com.intellij.compiler.CompilerWorkspaceConfiguration;
import com.intellij.compiler.impl.FileSetCompileScope;
import com.intellij.compiler.impl.ModuleCompileScope;
import com.intellij.compiler.impl.javaCompiler.AnnotationProcessingCompiler;
@@ -37,6 +37,7 @@
import com.intellij.psi.*;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.java.compiler.AnnotationProcessingConfiguration;
import java.text.MessageFormat;
import java.util.ArrayList;
@@ -79,7 +80,13 @@
return;
}
- CompilerConfiguration compilerConfiguration = CompilerConfiguration.getInstance(project);
+ if (CompilerWorkspaceConfiguration.getInstance(project).useOutOfProcessBuild()) {
+ presentation.setEnabled(false);
+ return;
+ }
+
+ final CompilerConfiguration compilerConfiguration = CompilerConfiguration.getInstance(project);
+
final Module module = LangDataKeys.MODULE.getData(dataContext);
final Module moduleContext = LangDataKeys.MODULE_CONTEXT.getData(dataContext);
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
index d9f3aac..e64ff40 100644
--- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
+++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
@@ -854,17 +854,35 @@
if (refreshOutputRoots) {
// refresh on output roots is required in order for the order enumerator to see all roots via VFS
final Set<File> outputs = new HashSet<File>();
- for (final String path : CompilerPathsEx.getOutputPaths(ModuleManager.getInstance(myProject).getModules())) {
+ final Module[] affectedModules = compileContext.getCompileScope().getAffectedModules();
+ for (final String path : CompilerPathsEx.getOutputPaths(affectedModules)) {
outputs.add(new File(path));
}
+ final LocalFileSystem lfs = LocalFileSystem.getInstance();
if (!outputs.isEmpty()) {
final ProgressIndicator indicator = compileContext.getProgressIndicator();
indicator.setText("Synchronizing output directories...");
- LocalFileSystem.getInstance().refreshIoFiles(outputs, false, false, null);
+ lfs.refreshIoFiles(outputs, false, false, null);
indicator.setText("");
}
+ if (compileContext.isAnnotationProcessorsEnabled()) {
+ final Set<File> genSourceRoots = new THashSet<File>(FileUtil.FILE_HASHING_STRATEGY);
+ final CompilerConfiguration config = CompilerConfiguration.getInstance(myProject);
+ for (Module module : affectedModules) {
+ if (config.getAnnotationProcessingConfiguration(module).isEnabled()) {
+ final String path = CompilerPaths.getAnnotationProcessorsGenerationPath(module);
+ if (path != null) {
+ genSourceRoots.add(new File(path));
+ }
+ }
+ }
+ if (!genSourceRoots.isEmpty()) {
+ // refresh generates source roots asynchronously; needed for error highlighting update
+ lfs.refreshIoFiles(genSourceRoots, true, true, null);
+ }
+ }
}
- SwingUtilities.invokeLater(new Runnable() {
+ SwingUtilities.invokeLater(new Runnable() {
public void run() {
int errorCount = 0;
int warningCount = 0;
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
index dc6cbd4..17f7c7d 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
@@ -21,6 +21,7 @@
import com.intellij.debugger.settings.*;
import com.intellij.debugger.ui.breakpoints.*;
import com.intellij.ide.DataManager;
+import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
@@ -31,16 +32,17 @@
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
+import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Key;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.xdebugger.AbstractDebuggerSession;
-import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointItem;
import com.intellij.xdebugger.breakpoints.ui.XBreakpointGroupingRule;
import com.intellij.xdebugger.impl.DebuggerSupport;
import com.intellij.xdebugger.impl.actions.DebuggerActionHandler;
import com.intellij.xdebugger.impl.actions.DebuggerToggleActionHandler;
import com.intellij.xdebugger.impl.actions.EditBreakpointActionHandler;
import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler;
+import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointItem;
import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider;
import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler;
import com.intellij.xdebugger.impl.settings.DebuggerSettingsPanelProvider;
@@ -212,15 +214,21 @@
}
@Override
- public void addListener(final BreakpointsListener listener, Project project) {
- BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(getCurrentProject()).getBreakpointManager();
+ public void addListener(final BreakpointsListener listener, Project project, Disposable disposable) {
+ BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(project).getBreakpointManager();
final MyBreakpointManagerListener listener1 = new MyBreakpointManagerListener(listener, breakpointManager);
breakpointManager.addBreakpointManagerListener(listener1);
myListeners.add(listener1);
+ Disposer.register(disposable, new Disposable() {
+ @Override
+ public void dispose() {
+ removeListener(listener);
+ }
+ });
}
@Override
- public void removeListener(BreakpointsListener listener) {
+ protected void removeListener(BreakpointsListener listener) {
for (MyBreakpointManagerListener managerListener : myListeners) {
if (managerListener.myListener == listener) {
BreakpointManager manager = managerListener.myBreakpointManager;
diff --git a/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java b/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java
index 0b2f4cb..2e5710a 100644
--- a/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java
+++ b/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java
@@ -17,9 +17,12 @@
import com.intellij.CommonBundle;
import com.intellij.ide.IdeBundle;
+import com.intellij.ide.util.PropertiesComponent;
+import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
+import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkTypeId;
import com.intellij.openapi.roots.ProjectRootManager;
@@ -31,6 +34,8 @@
import javax.swing.*;
import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
/**
* @author Dmitry Avdeev
@@ -52,6 +57,19 @@
myJdkComboBox = new JdkComboBox(myModel, sdkFilter);
+ final PropertiesComponent component = project == null ? PropertiesComponent.getInstance() : PropertiesComponent.getInstance(project);
+ ModuleType moduleType = moduleBuilder.getModuleType();
+ final String selectedJdkProperty = "jdk.selected." + (moduleType == null ? "" : moduleType.getId());
+ myJdkComboBox.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ Sdk jdk = myJdkComboBox.getSelectedJdk();
+ if (jdk != null) {
+ component.setValue(selectedJdkProperty, jdk.getName());
+ }
+ }
+ });
+
if (project != null) {
Sdk sdk = ProjectRootManager.getInstance(project).getProjectSdk();
if (sdk != null && moduleBuilder.isSuitableSdkType(sdk.getSdkType())) {
@@ -68,6 +86,14 @@
}
}
+ String value = component.getValue(selectedJdkProperty);
+ if (value != null) {
+ Sdk jdk = ProjectJdkTable.getInstance().findJdk(value);
+ if (jdk != null) {
+ myJdkComboBox.setSelectedJdk(jdk);
+ }
+ }
+
JButton button = new JButton("Ne\u001Bw...");
myJdkComboBox.setSetupButton(button, project, myModel,
project == null ? new JdkComboBox.NoneJdkComboBoxItem() : new JdkComboBox.ProjectJdkComboBoxItem(),
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
index 211bcfb..2098dd6 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
@@ -1357,9 +1357,9 @@
}
}
- final PsiClass aClass;
+ PsiClass aClass;
if (qualifier != null) {
- final PsiElement resolved = qualifier.resolve();
+ PsiElement resolved = qualifier.advancedResolve(true).getElement();
if (resolved != null && !(resolved instanceof PsiClass)) {
String description = JavaErrorMessages.message("class.expected");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(qualifier).descriptionAndTooltip(description).create();
@@ -1378,7 +1378,7 @@
if (expr instanceof PsiThisExpression) {
final PsiMethod psiMethod = PsiTreeUtil.getParentOfType(expr, PsiMethod.class);
- if (psiMethod == null || psiMethod.getContainingClass() != aClass) {
+ if (psiMethod == null || psiMethod.getContainingClass() != aClass && !isInsideDefaultMethod(psiMethod, aClass)) {
if (aClass.isInterface()) {
return thisNotFoundInInterfaceInfo(expr);
}
@@ -1394,6 +1394,13 @@
return null;
}
+ private static boolean isInsideDefaultMethod(PsiMethod method, PsiClass aClass) {
+ while (method != null && method.getContainingClass() != aClass) {
+ method = PsiTreeUtil.getParentOfType(method, PsiMethod.class, true);
+ }
+ return method != null && method.hasModifierProperty(PsiModifier.DEFAULT);
+ }
+
private static HighlightInfo thisNotFoundInInterfaceInfo(@NotNull PsiExpression expr) {
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expr).descriptionAndTooltip("Cannot find symbol variable this").create();
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MethodArgumentFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MethodArgumentFix.java
index 06a93cd..6ad881c 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MethodArgumentFix.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MethodArgumentFix.java
@@ -65,8 +65,9 @@
PsiExpression expression = myArgList.getExpressions()[myIndex];
try {
+ LOG.assertTrue(expression != null && expression.isValid());
PsiExpression modified = myArgumentFixerActionFactory.getModifiedArgument(expression, myToType);
- LOG.assertTrue(modified != null);
+ LOG.assertTrue(modified != null, myArgumentFixerActionFactory);
expression.replace(modified);
}
catch (IncorrectOperationException e) {
diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java
index 4f4d74c..faa2dee 100644
--- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java
+++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java
@@ -61,8 +61,7 @@
if (parent instanceof PsiMethodReferenceExpression) return null;
if (parent instanceof PsiJavaCodeReferenceElement && ((PsiJavaCodeReferenceElement)parent).getQualifier() != null) {
PsiJavaCodeReferenceElement refExpr = (PsiJavaCodeReferenceElement)parent;
- PsiReferenceParameterList parameterList = refExpr.getParameterList();
- if (parameterList != null && parameterList.getFirstChild() != null) return null;
+ if (checkParameterizedReference(refExpr)) return null;
PsiElement resolved = refExpr.resolve();
if (resolved instanceof PsiMember && ((PsiModifierListOwner)resolved).hasModifierProperty(PsiModifier.STATIC)) {
PsiClass aClass = getResolvedClass(element, (PsiMember)resolved);
@@ -99,6 +98,11 @@
return null;
}
+ private static boolean checkParameterizedReference(PsiJavaCodeReferenceElement refExpr) {
+ PsiReferenceParameterList parameterList = refExpr instanceof PsiReferenceExpression ? refExpr.getParameterList() : null;
+ return parameterList != null && parameterList.getFirstChild() != null;
+ }
+
@Nullable
private static PsiClass getResolvedClass(PsiElement element, PsiMember resolved) {
PsiClass aClass = resolved.getContainingClass();
@@ -158,58 +162,61 @@
@Override
public void visitReferenceElement(PsiJavaCodeReferenceElement reference) {
- if (reference.getParameterList() != null &&
- reference.getParameterList().getFirstChild() != null) return;
+ try {
+ if (checkParameterizedReference(reference)) return;
- if (referenceName.equals(reference.getReferenceName()) && !(reference instanceof PsiMethodReferenceExpression)) {
- final PsiElement qualifierExpression = reference.getQualifier();
- PsiElement referent = reference.getUserData(TEMP_REFERENT_USER_DATA);
- if (!reference.isQualified()) {
- if (referent instanceof PsiMember && referent != reference.resolve()) {
- PsiElementFactory factory = JavaPsiFacade.getInstance(reference.getProject()).getElementFactory();
- try {
- final PsiClass containingClass = ((PsiMember)referent).getContainingClass();
- if (containingClass != null) {
- PsiReferenceExpression copy = (PsiReferenceExpression)factory.createExpressionFromText("A." + reference.getReferenceName(), null);
- reference = (PsiReferenceExpression)reference.replace(copy);
- ((PsiReferenceExpression)reference.getQualifier()).bindToElement(containingClass);
+ if (referenceName.equals(reference.getReferenceName()) && !(reference instanceof PsiMethodReferenceExpression)) {
+ final PsiElement qualifierExpression = reference.getQualifier();
+ PsiElement referent = reference.getUserData(TEMP_REFERENT_USER_DATA);
+ if (!reference.isQualified()) {
+ if (referent instanceof PsiMember && referent != reference.resolve()) {
+ PsiElementFactory factory = JavaPsiFacade.getInstance(reference.getProject()).getElementFactory();
+ try {
+ final PsiClass containingClass = ((PsiMember)referent).getContainingClass();
+ if (containingClass != null) {
+ PsiReferenceExpression copy = (PsiReferenceExpression)factory.createExpressionFromText("A." + reference.getReferenceName(), null);
+ reference = (PsiReferenceExpression)reference.replace(copy);
+ ((PsiReferenceExpression)reference.getQualifier()).bindToElement(containingClass);
+ }
+ }
+ catch (IncorrectOperationException e) {
+ LOG.error (e);
}
}
- catch (IncorrectOperationException e) {
- LOG.error (e);
+ reference.putUserData(TEMP_REFERENT_USER_DATA, null);
+ } else {
+ if (qualifierExpression instanceof PsiJavaCodeReferenceElement) {
+ PsiElement aClass = ((PsiJavaCodeReferenceElement)qualifierExpression).resolve();
+ if (aClass instanceof PsiVariable) {
+ aClass = PsiUtil.resolveClassInClassTypeOnly(((PsiVariable)aClass).getType());
+ }
+ if (aClass instanceof PsiClass && InheritanceUtil.isInheritorOrSelf((PsiClass)aClass, resolvedClass, true)) {
+ boolean foundMemberByName = false;
+ if (referent instanceof PsiMember) {
+ final String memberName = ((PsiMember)referent).getName();
+ final PsiClass containingClass = PsiTreeUtil.getParentOfType(reference, PsiClass.class);
+ if (containingClass != null) {
+ foundMemberByName |= containingClass.findFieldByName(memberName, true) != null;
+ foundMemberByName |= containingClass.findMethodsByName(memberName, true).length > 0;
+ }
+ }
+ if (!foundMemberByName) {
+ try {
+ qualifierExpression.delete();
+ }
+ catch (IncorrectOperationException e) {
+ LOG.error(e);
+ }
+ }
+ }
}
}
reference.putUserData(TEMP_REFERENT_USER_DATA, null);
- } else {
- if (qualifierExpression instanceof PsiJavaCodeReferenceElement) {
- PsiElement aClass = ((PsiJavaCodeReferenceElement)qualifierExpression).resolve();
- if (aClass instanceof PsiVariable) {
- aClass = PsiUtil.resolveClassInClassTypeOnly(((PsiVariable)aClass).getType());
- }
- if (aClass instanceof PsiClass && InheritanceUtil.isInheritorOrSelf((PsiClass)aClass, resolvedClass, true)) {
- boolean foundMemberByName = false;
- if (referent instanceof PsiMember) {
- final String memberName = ((PsiMember)referent).getName();
- final PsiClass containingClass = PsiTreeUtil.getParentOfType(reference, PsiClass.class);
- if (containingClass != null) {
- foundMemberByName |= containingClass.findFieldByName(memberName, true) != null;
- foundMemberByName |= containingClass.findMethodsByName(memberName, true).length > 0;
- }
- }
- if (!foundMemberByName) {
- try {
- qualifierExpression.delete();
- }
- catch (IncorrectOperationException e) {
- LOG.error(e);
- }
- }
- }
- }
}
- reference.putUserData(TEMP_REFERENT_USER_DATA, null);
}
- super.visitReferenceElement(reference);
+ finally {
+ super.visitReferenceElement(reference);
+ }
}
});
}
diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java
index 123bc66..542a202 100644
--- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java
+++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java
@@ -273,11 +273,14 @@
final TextRange textRange = targetClass.getTextRange();
final RangeMarker startClassOffset = editor.getDocument().createRangeMarker(textRange.getStartOffset(), textRange.getEndOffset());
+ startClassOffset.setGreedyToLeft(true);
+ startClassOffset.setGreedyToRight(true);
editor.getDocument().deleteString(textRange.getStartOffset(), textRange.getEndOffset());
CreateFromUsageBaseFix.startTemplate(editor, template, project, new TemplateEditingAdapter() {
@Override
public void templateFinished(Template template, boolean brokenOff) {
try {
+ LOG.assertTrue(startClassOffset.isValid(), startClassOffset);
final PsiElement psiElement = containingFile.findElementAt(startClassOffset.getStartOffset());
final PsiClass aTargetClass = PsiTreeUtil.getParentOfType(psiElement, PsiClass.class);
LOG.assertTrue(aTargetClass != null, psiElement);
diff --git a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java
index d98845d..31ed040 100644
--- a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java
+++ b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java
@@ -340,7 +340,7 @@
DefaultArrangementEntry current = getCurrent();
JavaElementArrangementEntry entry;
if (canArrange) {
- TextRange expandedRange = myDocument == null ? null : ArrangementUtil.expandToLine(range, myDocument);
+ TextRange expandedRange = myDocument == null ? null : ArrangementUtil.expandToLineIfPossible(range, myDocument);
TextRange rangeToUse = expandedRange == null ? range : expandedRange;
entry = new JavaElementArrangementEntry(current, rangeToUse, type, name, true);
}
diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java
index 354d935..8aaf941 100644
--- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java
@@ -212,8 +212,8 @@
public void visitReferenceExpression(final PsiReferenceExpression expression) {
super.visitReferenceExpression(expression);
final PsiElement resolved = expression.resolve();
- if (resolved != null) {
- dependsOnMoved[0] |= isInMovedElement(resolved);
+ if (resolved instanceof PsiMember) {
+ dependsOnMoved[0] |= !((PsiMember)resolved).hasModifierProperty(PsiModifier.STATIC) && isInMovedElement(resolved);
}
}
});
@@ -550,6 +550,7 @@
final Project project = psiManager.getProject();
final GlobalSearchScope scope = GlobalSearchScope.allScope(project);
final Iterable<PsiReference> calls = ReferencesSearch.search(method, scope);
+ final String fullyQualifiedName = StringUtil.getQualifiedName(newPackageName, newClassName);
for (PsiReference reference : calls) {
final PsiElement referenceElement = reference.getElement();
@@ -557,9 +558,16 @@
if (parent instanceof PsiMethodCallExpression) {
final PsiMethodCallExpression call = (PsiMethodCallExpression)parent;
if (!isInMovedElement(call)) {
- final String fullyQualifiedName = StringUtil.getQualifiedName(newPackageName, newClassName);
usages.add(new RetargetStaticMethodCall(call, fullyQualifiedName));
}
+ } else if (parent instanceof PsiImportStaticStatement) {
+ final PsiJavaCodeReferenceElement importReference = ((PsiImportStaticStatement)parent).getImportReference();
+ if (importReference != null) {
+ final PsiElement qualifier = importReference.getQualifier();
+ if (qualifier instanceof PsiJavaCodeReferenceElement) {
+ usages.add(new ReplaceClassReference((PsiJavaCodeReferenceElement)qualifier, fullyQualifiedName));
+ }
+ }
}
}
usages.add(new RemoveMethod(method));
diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/RetargetStaticMethodCall.java b/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/RetargetStaticMethodCall.java
index 03a1413..3d3ab20 100644
--- a/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/RetargetStaticMethodCall.java
+++ b/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/RetargetStaticMethodCall.java
@@ -15,10 +15,7 @@
*/
package com.intellij.refactoring.extractclass.usageInfo;
-import com.intellij.psi.PsiExpression;
-import com.intellij.psi.PsiExpressionList;
-import com.intellij.psi.PsiMethodCallExpression;
-import com.intellij.psi.PsiReferenceExpression;
+import com.intellij.psi.*;
import com.intellij.refactoring.psi.MutationUtils;
import com.intellij.refactoring.util.FixableUsageInfo;
import com.intellij.util.IncorrectOperationException;
@@ -37,10 +34,12 @@
final PsiReferenceExpression methodExpression = call.getMethodExpression();
final PsiExpression qualifier = (PsiExpression) methodExpression.getQualifier();
if (qualifier == null) {
+ final PsiElement resolveScope = call.resolveMethodGenerics().getCurrentFileResolveScope();
+ if (!(resolveScope instanceof PsiImportStaticStatement)) {
MutationUtils.replaceExpression(delegateClassName + '.' + call.getText(), call);
+ }
} else {
- final PsiExpressionList parameterList = call.getArgumentList();
- MutationUtils.replaceExpression(delegateClassName + '.' + methodExpression.getReferenceName() +parameterList.getText() , call);
+ MutationUtils.replaceExpression(delegateClassName , qualifier);
}
}
}
diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersDialog.java b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersDialog.java
index 1be6743..98ec9af 100644
--- a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersDialog.java
+++ b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersDialog.java
@@ -32,6 +32,7 @@
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.refactoring.HelpID;
import com.intellij.refactoring.JavaRefactoringSettings;
import com.intellij.refactoring.RefactoringBundle;
@@ -411,7 +412,7 @@
}
public boolean isMemberEnabled(MemberInfo member) {
- if(myTargetClass != null && myTargetClass.isInterface()) {
+ if(myTargetClass != null && myTargetClass.isInterface() && !PsiUtil.isLanguageLevel8OrHigher(myTargetClass)) {
return !(member.getMember() instanceof PsiMethod);
}
return super.isMemberEnabled(member);
diff --git a/java/java-impl/src/com/intellij/refactoring/rename/JavaNameSuggestionProvider.java b/java/java-impl/src/com/intellij/refactoring/rename/JavaNameSuggestionProvider.java
index 1b76bc6..2588264 100644
--- a/java/java-impl/src/com/intellij/refactoring/rename/JavaNameSuggestionProvider.java
+++ b/java/java-impl/src/com/intellij/refactoring/rename/JavaNameSuggestionProvider.java
@@ -22,6 +22,7 @@
import com.intellij.psi.codeStyle.SuggestedNameInfo;
import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.util.PropertyUtil;
+import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.usageView.UsageViewUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
@@ -33,48 +34,23 @@
@Nullable
public SuggestedNameInfo getSuggestedNames(final PsiElement element, final PsiElement nameSuggestionContext, Set<String> result) {
String initialName = UsageViewUtil.getShortName(element);
- SuggestedNameInfo info = suggestNamesForElement(element);
+ SuggestedNameInfo info = suggestNamesForElement(element, nameSuggestionContext);
if (info != null) {
info = JavaCodeStyleManager.getInstance(element.getProject()).suggestUniqueVariableName(info, element, true, true);
}
String parameterName = null;
String superMethodName = null;
- if (nameSuggestionContext != null) {
+ if (nameSuggestionContext instanceof PsiParameter) {
final PsiElement nameSuggestionContextParent = nameSuggestionContext.getParent();
- if (nameSuggestionContextParent != null) {
+ if (nameSuggestionContextParent instanceof PsiParameterList) {
final PsiElement parentOfParent = nameSuggestionContextParent.getParent();
- if (parentOfParent instanceof PsiExpressionList) {
- final PsiExpressionList expressionList = (PsiExpressionList)parentOfParent;
- final PsiElement parent = expressionList.getParent();
- if (parent instanceof PsiCallExpression) {
- final PsiMethod method = ((PsiCallExpression)parent).resolveMethod();
- if (method != null) {
- final PsiParameter[] parameters = method.getParameterList().getParameters();
- final PsiExpression[] expressions = expressionList.getExpressions();
- for (int i = 0; i < expressions.length; i++) {
- PsiExpression expression = expressions[i];
- if (expression == nameSuggestionContextParent) {
- if (i < parameters.length) {
- parameterName = parameters[i].getName();
- }
- break;
- }
- }
- }
+ if (parentOfParent instanceof PsiMethod) {
+ final String propName = PropertyUtil.getPropertyName((PsiMethod)parentOfParent);
+ if (propName != null) {
+ parameterName = propName;
}
- }
- else if (parentOfParent instanceof PsiParameterList) {
- final PsiElement parent3 = parentOfParent.getParent();
- if (parent3 instanceof PsiMethod) {
- final String propName = PropertyUtil.getPropertyName((PsiMethod)parent3);
- if (propName != null) {
- parameterName = propName;
- }
- if (nameSuggestionContextParent instanceof PsiParameter) {
- superMethodName = getSuperMethodName((PsiParameter) nameSuggestionContextParent, (PsiMethod) parent3);
- }
- }
+ superMethodName = getSuperMethodName((PsiParameter) nameSuggestionContext, (PsiMethod) parentOfParent);
}
}
}
@@ -166,7 +142,7 @@
}
@Nullable
- private static SuggestedNameInfo suggestNamesForElement(final PsiElement element) {
+ private static SuggestedNameInfo suggestNamesForElement(final PsiElement element, PsiElement nameSuggestionContext) {
PsiVariable var = null;
if (element instanceof PsiVariable) {
var = (PsiVariable)element;
@@ -182,7 +158,13 @@
JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(element.getProject());
VariableKind variableKind = codeStyleManager.getVariableKind(var);
- return codeStyleManager.suggestVariableName(variableKind, null, var.getInitializer(), var.getType());
+ final SuggestedNameInfo nameInfo = codeStyleManager.suggestVariableName(variableKind, null, var.getInitializer(), var.getType());
+ final PsiExpression expression = PsiTreeUtil.getParentOfType(nameSuggestionContext, PsiExpression.class, false);
+ if (expression != null) {
+ return new SuggestedNameInfo.Delegate(codeStyleManager.suggestVariableName(variableKind, null, expression, var.getType()).names, nameInfo);
+
+ }
+ return nameInfo;
}
}
diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
index 950ba6f..871c964 100644
--- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
@@ -734,7 +734,7 @@
public static boolean isInside (PsiElement place, PsiElement ancestor) {
if (SafeDeleteProcessor.isInside(place, ancestor)) return true;
- if (place instanceof PsiComment && ancestor instanceof PsiClass) {
+ if (PsiTreeUtil.getParentOfType(place, PsiComment.class, false) != null && ancestor instanceof PsiClass) {
final PsiClass aClass = (PsiClass)ancestor;
if (aClass.getParent() instanceof PsiJavaFile) {
final PsiJavaFile file = (PsiJavaFile)aClass.getParent();
diff --git a/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java b/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java
index 560dcbd..85fae45 100644
--- a/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java
+++ b/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java
@@ -93,7 +93,15 @@
}
public PsiType getUpperBound () {
- return myExistential.isExtends() ? myExistential.getBound() : PsiType.getJavaLangObject(myContext.getManager(), getResolveScope());
+ final PsiType bound = myExistential.getBound();
+ if (myExistential.isExtends()) {
+ return bound;
+ }
+ else {
+ return bound instanceof PsiCapturedWildcardType
+ ? ((PsiCapturedWildcardType)bound).getUpperBound()
+ : PsiType.getJavaLangObject(myContext.getManager(), getResolveScope());
+ }
}
public PsiWildcardType getWildcard() {
diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
index 49fbfec..b0f7d45 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
@@ -466,7 +466,8 @@
final PsiParameter[] parms = method.getParameterList().getParameters();
if (args.length < parms.length - 1) return ApplicabilityLevel.NOT_APPLICABLE;
- final boolean isRaw = isRawSubstitutor(method, substitutorForMethod);
+ final PsiClass containingClass = method.getContainingClass();
+ final boolean isRaw = containingClass != null && isRawSubstitutor(containingClass, substitutorForMethod);
if (!areFirstArgumentsApplicable(args, parms, languageLevel, substitutorForMethod, isRaw)) return ApplicabilityLevel.NOT_APPLICABLE;
if (args.length == parms.length) {
if (parms.length == 0) return ApplicabilityLevel.FIXED_ARITY;
diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java b/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java
index 5696b8b..5d2c6aa 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java
@@ -58,6 +58,11 @@
proveArrayTypeDistinct(((PsiWildcardType)type1).getManager().getProject(), (PsiArrayType)extendsBound, type2)) return true;
final PsiClass boundClass1 = PsiUtil.resolveClassInType(extendsBound);
if (boundClass1 == null) return false;
+
+ if (CommonClassNames.JAVA_LANG_OBJECT.equals(psiClass2.getQualifiedName())) {
+ return !CommonClassNames.JAVA_LANG_OBJECT.equals(boundClass1.getQualifiedName());
+ }
+
return proveExtendsBoundsDistinct(type1, type2, boundClass1, psiClass2);
}
diff --git a/java/java-psi-impl/java-psi-impl.iml b/java/java-psi-impl/java-psi-impl.iml
index 89e9dba..8fa9e62 100644
--- a/java/java-psi-impl/java-psi-impl.iml
+++ b/java/java-psi-impl/java-psi-impl.iml
@@ -11,6 +11,8 @@
<orderEntry type="module" module-name="core-impl" exported="" />
<orderEntry type="module" module-name="resources-en" />
<orderEntry type="library" name="asm4" level="project" />
+ <orderEntry type="module" module-name="openapi" />
+ <orderEntry type="module" module-name="external-system-api" />
</component>
</module>
diff --git a/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectData.java b/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectData.java
new file mode 100644
index 0000000..d1f5bfa
--- /dev/null
+++ b/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectData.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.externalSystem;
+
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.externalSystem.model.Key;
+import com.intellij.openapi.externalSystem.model.ProjectSystemId;
+import com.intellij.openapi.externalSystem.model.project.AbstractProjectEntityData;
+import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
+import com.intellij.openapi.projectRoots.JavaSdkVersion;
+import com.intellij.pom.java.LanguageLevel;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Denis Zhdanov
+ * @since 4/12/13 12:27 PM
+ */
+public class JavaProjectData extends AbstractProjectEntityData {
+
+ @NotNull public static final Key<JavaProjectData> KEY = Key.create(JavaProjectData.class);
+
+ private static final Logger LOG = Logger.getInstance("#" + JavaProjectData.class.getName());
+
+ private static final long serialVersionUID = 1L;
+
+ private static final LanguageLevel DEFAULT_LANGUAGE_LEVEL = LanguageLevel.JDK_1_6;
+ private static final JavaSdkVersion DEFAULT_JDK_VERSION = JavaSdkVersion.JDK_1_6;
+ private static final Pattern JDK_VERSION_PATTERN = Pattern.compile(".*1\\.(\\d+).*");
+
+ @NotNull private JavaSdkVersion myJdkVersion = DEFAULT_JDK_VERSION;
+ @NotNull private LanguageLevel myLanguageLevel = DEFAULT_LANGUAGE_LEVEL;
+
+ @NotNull private String myCompileOutputPath;
+
+ public JavaProjectData(@NotNull ProjectSystemId owner, @NotNull String compileOutputPath) {
+ super(owner);
+ myCompileOutputPath = compileOutputPath;
+ }
+
+ @NotNull
+ public String getCompileOutputPath() {
+ return myCompileOutputPath;
+ }
+
+ public void setCompileOutputPath(@NotNull String compileOutputPath) {
+ myCompileOutputPath = ExternalSystemApiUtil.toCanonicalPath(compileOutputPath);
+ }
+
+ @NotNull
+ public JavaSdkVersion getJdkVersion() {
+ return myJdkVersion;
+ }
+
+ public void setJdkVersion(@NotNull JavaSdkVersion jdkVersion) {
+ myJdkVersion = jdkVersion;
+ }
+
+ public void setJdkVersion(@Nullable String jdk) {
+ if (jdk == null) {
+ return;
+ }
+ try {
+ int version = Integer.parseInt(jdk.trim());
+ if (applyJdkVersion(version)) {
+ return;
+ }
+ }
+ catch (NumberFormatException e) {
+ // Ignore.
+ }
+
+ Matcher matcher = JDK_VERSION_PATTERN.matcher(jdk);
+ if (!matcher.matches()) {
+ return;
+ }
+ String versionAsString = matcher.group(1);
+ try {
+ applyJdkVersion(Integer.parseInt(versionAsString));
+ }
+ catch (NumberFormatException e) {
+ // Ignore.
+ }
+ }
+
+ public boolean applyJdkVersion(int version) {
+ if (version < 0 || version >= JavaSdkVersion.values().length) {
+ LOG.warn(String.format(
+ "Unsupported jdk version detected (%d). Expected to get number from range [0; %d]", version, JavaSdkVersion.values().length
+ ));
+ return false;
+ }
+ for (JavaSdkVersion sdkVersion : JavaSdkVersion.values()) {
+ if (sdkVersion.ordinal() == version) {
+ myJdkVersion = sdkVersion;
+ return true;
+ }
+ }
+ assert false : version + ", max value: " + JavaSdkVersion.values().length;
+ return false;
+ }
+
+ @NotNull
+ public LanguageLevel getLanguageLevel() {
+ return myLanguageLevel;
+ }
+
+ public void setLanguageLevel(@NotNull LanguageLevel level) {
+ myLanguageLevel = level;
+ }
+
+ public void setLanguageLevel(@Nullable String languageLevel) {
+ LanguageLevel level = LanguageLevel.parse(languageLevel);
+ if (level != null) {
+ myLanguageLevel = level;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ int result = super.hashCode();
+ result = 31 * result + myJdkVersion.hashCode();
+ result = 31 * result + myLanguageLevel.hashCode();
+ result = 31 * result + myCompileOutputPath.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+
+ JavaProjectData project = (JavaProjectData)o;
+
+ if (!myCompileOutputPath.equals(project.myCompileOutputPath)) return false;
+ if (myJdkVersion != project.myJdkVersion) return false;
+ if (myLanguageLevel != project.myLanguageLevel) return false;
+
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "java project";
+ }
+}
diff --git a/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectDataService.java b/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectDataService.java
new file mode 100644
index 0000000..05132a8
--- /dev/null
+++ b/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectDataService.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.externalSystem;
+
+import com.intellij.openapi.externalSystem.model.DataNode;
+import com.intellij.openapi.externalSystem.model.Key;
+import com.intellij.openapi.externalSystem.model.ProjectSystemId;
+import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataService;
+import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.JavaSdk;
+import com.intellij.openapi.projectRoots.JavaSdkVersion;
+import com.intellij.openapi.projectRoots.ProjectJdkTable;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.roots.LanguageLevelProjectExtension;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.pom.java.LanguageLevel;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author Denis Zhdanov
+ * @since 4/15/13 12:09 PM
+ */
+public class JavaProjectDataService implements ProjectDataService<JavaProjectData> {
+
+ @NotNull
+ @Override
+ public Key<JavaProjectData> getTargetDataKey() {
+ return JavaProjectData.KEY;
+ }
+
+ @Override
+ public void importData(@NotNull Collection<DataNode<JavaProjectData>> toImport, @NotNull Project project, boolean synchronous) {
+ if (toImport.size() != 1) {
+ throw new IllegalArgumentException(String.format("Expected to get a single project but got %d: %s", toImport.size(), toImport));
+ }
+ JavaProjectData projectData = toImport.iterator().next().getData();
+
+ // JDK.
+ JavaSdkVersion version = projectData.getJdkVersion();
+ JavaSdk javaSdk = JavaSdk.getInstance();
+ ProjectRootManager rootManager = ProjectRootManager.getInstance(project);
+ Sdk sdk = rootManager.getProjectSdk();
+ if (sdk instanceof JavaSdk) {
+ JavaSdkVersion currentVersion = javaSdk.getVersion(sdk);
+ if (currentVersion == null || !currentVersion.isAtLeast(version)) {
+ Sdk newJdk = findJdk(version);
+ if (newJdk != null) {
+ rootManager.setProjectSdk(sdk);
+ LanguageLevel level = version.getMaxLanguageLevel();
+ LanguageLevelProjectExtension ext = LanguageLevelProjectExtension.getInstance(project);
+ if (level.compareTo(ext.getLanguageLevel()) < 0) {
+ ext.setLanguageLevel(level);
+ }
+ }
+ }
+ }
+ // Language level.
+ setLanguageLevel(projectData.getLanguageLevel(), project, synchronous);
+ }
+
+ @Nullable
+ private static Sdk findJdk(@NotNull JavaSdkVersion version) {
+ JavaSdk javaSdk = JavaSdk.getInstance();
+ List<Sdk> javaSdks = ProjectJdkTable.getInstance().getSdksOfType(javaSdk);
+ Sdk candidate = null;
+ for (Sdk sdk : javaSdks) {
+ JavaSdkVersion v = javaSdk.getVersion(sdk);
+ if (v == version) {
+ return sdk;
+ }
+ else if (candidate == null && v != null && version.getMaxLanguageLevel().isAtLeast(version.getMaxLanguageLevel())) {
+ candidate = sdk;
+ }
+ }
+ return candidate;
+ }
+
+ @Override
+ public void removeData(@NotNull Collection<DataNode<JavaProjectData>> toRemove, @NotNull Project project, boolean synchronous) {
+ }
+
+ @SuppressWarnings("MethodMayBeStatic")
+ public void setLanguageLevel(@NotNull final LanguageLevel languageLevel, @NotNull Project project, boolean synchronous) {
+ final LanguageLevelProjectExtension languageLevelExtension = LanguageLevelProjectExtension.getInstance(project);
+ if (languageLevelExtension.getLanguageLevel().isAtLeast(languageLevel)) {
+ return;
+ }
+ ExternalSystemApiUtil.executeProjectChangeAction(project, ProjectSystemId.IDE, synchronous, new Runnable() {
+ @Override
+ public void run() {
+ languageLevelExtension.setLanguageLevel(languageLevel);
+ }
+ });
+ }
+
+}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java
index 27bf4b5..d0f86c7 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java
@@ -21,7 +21,6 @@
import com.intellij.lexer.JavaLexer;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.text.StringUtil;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
@@ -200,7 +199,7 @@
throw new IncorrectOperationException("Cannot create field with type \"null\".");
}
- final String text = StringUtil.join("class _Dummy_ { private ", type.getCanonicalText(), " ", name, "; }");
+ final String text = "class _Dummy_ { private " + type.getCanonicalText() + " " + name + "; }";
final PsiJavaFile aFile = createDummyJavaFile(text);
final PsiClass[] classes = aFile.getClasses();
if (classes.length < 1) {
@@ -225,7 +224,7 @@
}
final String canonicalText = returnType.getCanonicalText();
- final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("class _Dummy_ { public " + canonicalText, " ", name, "() {} }"));
+ final PsiJavaFile aFile = createDummyJavaFile("class _Dummy_ { public " + canonicalText + " " + name + "() {} }");
final PsiClass[] classes = aFile.getClasses();
if (classes.length < 1) {
throw new IncorrectOperationException("Class was not created. Method name: " + name + "; return type: " + canonicalText);
@@ -248,7 +247,7 @@
@NotNull
@Override
public PsiMethod createConstructor(@NotNull @NonNls final String name) {
- final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("class ", name, " { public ", name, "() {} }"));
+ final PsiJavaFile aFile = createDummyJavaFile("class " + name + " { public " + name + "() {} }");
final PsiMethod method = aFile.getClasses()[0].getMethods()[0];
return (PsiMethod)CodeStyleManager.getInstance(myManager.getProject()).reformat(method);
}
@@ -274,7 +273,7 @@
throw new IncorrectOperationException("Cannot create parameter with type \"null\".");
}
- final String text = StringUtil.join(type.getCanonicalText() + " " + name);
+ final String text = type.getCanonicalText() + " " + name;
PsiParameter parameter = createParameterFromText(text, null);
final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(myManager.getProject());
PsiUtil.setModifierProperty(parameter, PsiModifier.FINAL,
@@ -429,7 +428,7 @@
@NotNull
@Override
public PsiPackageStatement createPackageStatement(@NotNull final String name) throws IncorrectOperationException {
- final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("package ", name, ";"));
+ final PsiJavaFile aFile = createDummyJavaFile("package " + name + ";");
final PsiPackageStatement stmt = aFile.getPackageStatement();
if (stmt == null) {
throw new IncorrectOperationException("Incorrect package name: " + name);
@@ -448,7 +447,7 @@
throw new IncorrectOperationException("Cannot create import statement for local class.");
}
- final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("import static ", aClass.getQualifiedName(), ".", memberName, ";"));
+ final PsiJavaFile aFile = createDummyJavaFile("import static " + aClass.getQualifiedName() + "." + memberName + ";");
final PsiImportStatementBase statement = extractImport(aFile, true);
return (PsiImportStaticStatement)CodeStyleManager.getInstance(myManager.getProject()).reformat(statement);
}
@@ -548,7 +547,7 @@
throw new IncorrectOperationException("Cannot create import statement for local class.");
}
- final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("import ", aClass.getQualifiedName(), ";"));
+ final PsiJavaFile aFile = createDummyJavaFile("import " + aClass.getQualifiedName() + ";");
final PsiImportStatementBase statement = extractImport(aFile, false);
return (PsiImportStatement)CodeStyleManager.getInstance(myManager.getProject()).reformat(statement);
}
@@ -563,7 +562,7 @@
throw new IncorrectOperationException("Incorrect package name: \"" + packageName + "\".");
}
- final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("import ", packageName, ".*;"));
+ final PsiJavaFile aFile = createDummyJavaFile("import " + packageName + ".*;");
final PsiImportStatementBase statement = extractImport(aFile, false);
return (PsiImportStatement)CodeStyleManager.getInstance(myManager.getProject()).reformat(statement);
}
@@ -580,7 +579,7 @@
throw new IncorrectOperationException("Cannot create variable with type \"null\".");
}
- final String text = "X " + (initializer != null ? " = x" : "") + " = x";
+ final String text = "X " + name + (initializer != null ? " = x" : "") + ";";
final PsiDeclarationStatement statement = (PsiDeclarationStatement)createStatementFromText(text, null);
final PsiVariable variable = (PsiVariable)statement.getDeclaredElements()[0];
@@ -719,7 +718,7 @@
throw new IncorrectOperationException("Unexpected type:" + exceptionType);
}
- final String text = StringUtil.join("catch (", exceptionType.getCanonicalText(), " ", exceptionName, ") {}");
+ final String text = "catch (" + exceptionType.getCanonicalText() + " " + exceptionName + ") {}";
final DummyHolder holder = DummyHolderFactory.createHolder(myManager, new JavaDummyElement(text, CATCH_SECTION, level(context)), context);
final PsiElement element = SourceTreeToPsiMap.treeElementToPsi(holder.getTreeElement().getFirstChildNode());
if (!(element instanceof PsiCatchSection)) {
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java
index 4c83755..cc46b4b 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java
@@ -16,11 +16,13 @@
package com.intellij.psi.impl.source;
import com.intellij.lang.ASTNode;
-import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.source.codeStyle.CodeEditUtil;
-import com.intellij.psi.impl.source.tree.*;
+import com.intellij.psi.impl.source.tree.CompositePsiElement;
+import com.intellij.psi.impl.source.tree.ElementType;
+import com.intellij.psi.impl.source.tree.JavaElementType;
+import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
@@ -36,8 +38,6 @@
import java.util.List;
public class PsiTypeElementImpl extends CompositePsiElement implements PsiTypeElement {
- private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.PsiTypeElementImpl");
-
private volatile PsiType myCachedType = null;
@SuppressWarnings({"UnusedDeclaration"})
@@ -120,22 +120,16 @@
if (PsiUtil.isJavaToken(child, JavaTokenType.QUEST)) {
assert type == null : this;
- PsiElement next = PsiTreeUtil.skipSiblingsForward(child, PsiComment.class, PsiWhiteSpace.class);
- if (next == null) {
- type = PsiWildcardType.createUnbounded(getManager());
+ PsiElement boundKind = PsiTreeUtil.skipSiblingsForward(child, PsiComment.class, PsiWhiteSpace.class);
+ PsiElement boundType = PsiTreeUtil.skipSiblingsForward(boundKind, PsiComment.class, PsiWhiteSpace.class);
+ if (PsiUtil.isJavaToken(boundKind, JavaTokenType.EXTENDS_KEYWORD) && boundType instanceof PsiTypeElement) {
+ type = PsiWildcardType.createExtends(getManager(), ((PsiTypeElement)boundType).getType());
+ }
+ else if (PsiUtil.isJavaToken(boundKind, JavaTokenType.SUPER_KEYWORD) && boundType instanceof PsiTypeElement) {
+ type = PsiWildcardType.createSuper(getManager(), ((PsiTypeElement)boundType).getType());
}
else {
- PsiElement bound = PsiTreeUtil.skipSiblingsForward(next, PsiComment.class, PsiWhiteSpace.class);
- if (PsiUtil.isJavaToken(next, JavaTokenType.EXTENDS_KEYWORD) && bound instanceof PsiTypeElement) {
- type = PsiWildcardType.createExtends(getManager(), ((PsiTypeElement)bound).getType());
- }
- else if (PsiUtil.isJavaToken(next, JavaTokenType.SUPER_KEYWORD) && bound instanceof PsiTypeElement) {
- type = PsiWildcardType.createSuper(getManager(), ((PsiTypeElement)bound).getType());
- }
- else {
- LOG.error("next=" + next + " bound=" + bound + ": " + this);
- type = PsiWildcardType.createUnbounded(getManager());
- }
+ type = PsiWildcardType.createUnbounded(getManager());
}
PsiAnnotation[] array = ContainerUtil.copyAndClear(annotations, PsiAnnotation.ARRAY_FACTORY, true);
type = ((PsiWildcardType)type).annotate(array);
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java
index 8b33ab2..712b32c 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java
@@ -26,6 +26,7 @@
import com.intellij.psi.tree.ChildRoleBase;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
+import com.intellij.psi.util.PsiUtil;
import com.intellij.util.CharTable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -134,12 +135,17 @@
}
}
else if (psiClass.isInterface()) {
+ final boolean level8OrHigher = PsiUtil.isLanguageLevel8OrHigher(psiClass);
for (ASTNode child = first; child != afterLast; child = next) {
next = child.getTreeNext();
- if (child.getElementType() == JavaElementType.METHOD || child.getElementType() == JavaElementType.FIELD) {
+ final IElementType childElementType = child.getElementType();
+ if (childElementType == JavaElementType.METHOD || childElementType == JavaElementType.FIELD) {
CompositeElement modifierList = (CompositeElement)((CompositeElement)child).findChildByRole(ChildRole.MODIFIER_LIST);
+ final TokenSet removeModifiersBitSet = level8OrHigher && childElementType == JavaElementType.METHOD
+ ? MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET_18_METHOD
+ : MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET;
while (true) {
- ASTNode modifier = modifierList.findChildByType(MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET);
+ ASTNode modifier = modifierList.findChildByType(removeModifiersBitSet);
if (modifier == null) break;
modifierList.deleteChildInternal(modifier);
}
@@ -233,6 +239,12 @@
NATIVE_KEYWORD
);
+ private static final TokenSet MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET_18_METHOD = TokenSet.create(
+ PUBLIC_KEYWORD, ABSTRACT_KEYWORD,
+ FINAL_KEYWORD,
+ NATIVE_KEYWORD
+ );
+
private static final TokenSet MODIFIERS_TO_REMOVE_IN_ENUM_BIT_SET = TokenSet.create(
PUBLIC_KEYWORD, FINAL_KEYWORD
);
diff --git a/java/java-runtime/src/FormPreviewFrame.java b/java/java-runtime/src/FormPreviewFrame.java
index 939c468..5e69856 100644
--- a/java/java-runtime/src/FormPreviewFrame.java
+++ b/java/java-runtime/src/FormPreviewFrame.java
@@ -53,8 +53,10 @@
}
frame.pack();
- Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
- frame.setLocation((screenSize.width - frame.getWidth())/2, (screenSize.height - frame.getHeight())/2);
+ Rectangle screenBounds =
+ GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().getBounds();
+ frame.setLocation(screenBounds.x + (screenBounds.width - frame.getWidth()) / 2,
+ screenBounds.y + (screenBounds.height - frame.getHeight()) / 2);
frame.setVisible(true);
}
diff --git a/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java b/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java
index 8b45dca..4e3b6c8 100644
--- a/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java
+++ b/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java
@@ -21,20 +21,25 @@
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
IdeaAntLogger2.guardStreams();
-
- // first try to use the new way of launching ant
+
+ // as we build classpath ourselves, and ensure all libraries are added to classpath,
+ // preferred way for us to run ant will be using the traditional ant entry point, via the "Main" class
try {
- final Class antLauncher = Class.forName("org.apache.tools.ant.launch.Launcher");
+ final Class antMain = Class.forName("org.apache.tools.ant.Main");
//noinspection HardCodedStringLiteral
- antLauncher.getMethod("main", new Class[]{args.getClass()}).invoke(null, new Object[]{args});
+ antMain.getMethod("main", new Class[]{args.getClass()}).invoke(null, new Object[]{args});
return;
}
catch (ClassNotFoundException e) {
- // ignore and try older variant
+ // ignore
}
-
- final Class antMain = Class.forName("org.apache.tools.ant.Main");
+
+ // fallback: try the newer approach, launcher
+ // This approach is less preferred in our case, but still...
+ // From the ant documentation: "You should start the launcher with the most minimal classpath possible, generally just the ant-launcher.jar."
+ final Class antLauncher = Class.forName("org.apache.tools.ant.launch.Launcher");
//noinspection HardCodedStringLiteral
- antMain.getMethod("main", new Class[]{args.getClass()}).invoke(null, new Object[]{args});
+ antLauncher.getMethod("main", new Class[]{args.getClass()}).invoke(null, new Object[]{args});
+
}
}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedThisSuper.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedThisSuper.java
index cba08cd..76336cd 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedThisSuper.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedThisSuper.java
@@ -15,3 +15,10 @@
System.out.println(<error descr="'Z' is not an enclosing class">Z.super</error>.toString());
}
}
+
+class W {
+ static String some = "";
+ static void m() {
+ synchronized (<error descr="Class name expected here">some</error>.this) { }
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA104992.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA104992.java
new file mode 100644
index 0000000..3798c70
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA104992.java
@@ -0,0 +1,17 @@
+import java.util.Collection;
+import java.util.Set;
+
+class FooObject<T> {}
+class FooId<T extends FooObject> {}
+
+interface Bar {
+ <T extends FooObject, I extends FooId<? extends T>> T get(I key);
+ <T extends FooObject, I extends FooId<? extends T>> Collection<T> get(Collection<I> keys);
+}
+
+public class Target {
+ void foo(Bar bar) {
+ final Set<FooId<?>> keys = null;
+ final Collection<FooObject> values = bar.get(keys);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105695.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105695.java
new file mode 100644
index 0000000..ab28299
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105695.java
@@ -0,0 +1,10 @@
+import java.util.Map;
+
+public class Test {
+ void bar(Prop p) {
+ Map<? extends String, ? extends String> map = <error descr="Inconvertible types; cannot cast 'Prop' to 'java.util.Map<? extends java.lang.String,? extends java.lang.String>'">(Map<? extends String, ? extends String>)p</error>;
+ }
+}
+
+abstract class Hashtble<K,V> implements Map<K,V> {}
+abstract class Prop extends Hashtble<Object, Object>{}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105846.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105846.java
new file mode 100644
index 0000000..8b9c700
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105846.java
@@ -0,0 +1,5 @@
+class MyClass {
+ public static void main(Class<? extends MyClass> clazz){
+ clazz = (Class<? extends MyClass>) clazz.getSuperclass();
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/ThisAccessibility.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/ThisAccessibility.java
new file mode 100644
index 0000000..c43ef52
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/ThisAccessibility.java
@@ -0,0 +1,24 @@
+interface Bazz {
+ Bazz foo = <error descr="Cannot find symbol variable this">Bazz.this</error>;
+ static void foo1() {
+ Bazz foo = <error descr="'Bazz.this' cannot be referenced from a static context">Bazz.this</error>;
+ }
+
+ Runnable bar = new Runnable() {
+ @Override
+ public void run() {
+ Bazz f = <error descr="Cannot find symbol variable this">Bazz.this</error>;
+ }
+ };
+
+
+ default void foo() {
+ Bazz foo = Bazz.this;
+ Runnable r = new Runnable() {
+ @Override
+ public void run() {
+ Bazz f = Bazz.this;
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Intersection.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Intersection.java
new file mode 100644
index 0000000..4b04c7a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Intersection.java
@@ -0,0 +1,14 @@
+import java.io.*;
+interface Predicate<T> {
+ boolean test(String s);
+}
+class Test {
+ private static boolean test(String s) {
+ return false;
+ }
+
+ {
+ Predicate<String> mh1 = (Predicate<String> & Serializable)Test::test;
+ Predicate<String> mh0 = (<warning descr="Casting 'Test::test' to 'Predicate<String> & Predicate<String>' is redundant">Predicate<String> & Predicate<String></warning>)Test::test;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Ser.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Ser.java
new file mode 100644
index 0000000..c4b4bef
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Ser.java
@@ -0,0 +1,20 @@
+import java.io.*;
+interface Predicate<T> {
+ boolean test(String s);
+}
+interface SerPredicate<T> extends Predicate<T>, Serializable {
+}
+
+interface NonSerPredicate<T> extends Predicate<T> {
+}
+
+class Test {
+ private static boolean test(String s) {
+ return false;
+ }
+
+ {
+ Predicate<String> mh2 = (SerPredicate<String>)Test::test;
+ Predicate<String> mh02 = (<warning descr="Casting 'Test::test' to 'NonSerPredicate<String>' is redundant">NonSerPredicate<String></warning>)Test::test;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/DisabledInsideParameterizedReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/DisabledInsideParameterizedReference.java
new file mode 100644
index 0000000..b349ea7
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/DisabledInsideParameterizedReference.java
@@ -0,0 +1,6 @@
+import foo.*;
+class Class2 {
+ public static void main(String[] args) {
+ Class1.<String>f<caret>oo();
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference.java
new file mode 100644
index 0000000..85aa9ae
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference.java
@@ -0,0 +1,6 @@
+import foo.*;
+class Class2 {
+ public static void main(String[] args) {
+ new Class1.Inn<caret>er2<Class1.Inner1>();
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference.java
new file mode 100644
index 0000000..cf579dd
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference.java
@@ -0,0 +1,6 @@
+import foo.*;
+class Class2 {
+ public static void main(String[] args) {
+ new Class1.Inner2<Class1.In<caret>ner1>();
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference_after.java
new file mode 100644
index 0000000..9a2ff4d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference_after.java
@@ -0,0 +1,9 @@
+import foo.*;
+
+import static foo.Class1.Inner1;
+
+class Class2 {
+ public static void main(String[] args) {
+ new Class1.Inner2<Inner1>();
+ }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference_after.java
new file mode 100644
index 0000000..6f57f14
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference_after.java
@@ -0,0 +1,9 @@
+import foo.*;
+
+import static foo.Class1.Inner2;
+
+class Class2 {
+ public static void main(String[] args) {
+ new Inner2<Class1.Inner1>();
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Extracted.java b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Extracted.java
new file mode 100644
index 0000000..50d8f56
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Extracted.java
@@ -0,0 +1,5 @@
+public class Extracted {
+ public static <T> T foo() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Test.java b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Test.java
new file mode 100644
index 0000000..1260839
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Test.java
@@ -0,0 +1,6 @@
+class Test {
+
+ {
+ String s = true ? Extracted.<String>foo() : "";
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/before/Test.java b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/before/Test.java
new file mode 100644
index 0000000..57a1130
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/before/Test.java
@@ -0,0 +1,7 @@
+class Test {
+ public static <T> T foo() { return null; }
+
+ {
+ String s = true ? Test.<String>foo() : "";
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Extracted.java b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Extracted.java
new file mode 100644
index 0000000..c2ef3ae
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Extracted.java
@@ -0,0 +1,7 @@
+package foo;
+
+public class Extracted {
+ public static <T> T foo() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Test.java b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Test.java
new file mode 100644
index 0000000..4d2368c
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Test.java
@@ -0,0 +1,3 @@
+package foo;
+class Test {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Usage.java b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Usage.java
new file mode 100644
index 0000000..4a102ee
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Usage.java
@@ -0,0 +1,8 @@
+package foo;
+import static foo.Extracted.foo;
+
+class Usage {
+ {
+ foo();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Test.java b/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Test.java
new file mode 100644
index 0000000..7a2b3a3
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Test.java
@@ -0,0 +1,4 @@
+package foo;
+class Test {
+ public static <T> T foo() { return null; }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Usage.java b/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Usage.java
new file mode 100644
index 0000000..4d6c4f2
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Usage.java
@@ -0,0 +1,8 @@
+package foo;
+import static foo.Test.foo;
+
+class Usage {
+ {
+ foo();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/A.java b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/A.java
new file mode 100644
index 0000000..61ff2ab
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/A.java
@@ -0,0 +1,2 @@
+public class A {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/B.java b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/B.java
new file mode 100644
index 0000000..a4e6f3f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/B.java
@@ -0,0 +1,5 @@
+public interface B {
+ static void foo() {
+ System.out.println("Hello");
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/A.java b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/A.java
new file mode 100644
index 0000000..1144c81
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/A.java
@@ -0,0 +1,5 @@
+public class A {
+ public static void foo() {
+ System.out.println("Hello");
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/B.java b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/B.java
new file mode 100644
index 0000000..375942a
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/B.java
@@ -0,0 +1,2 @@
+public interface B {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/after/foo/I.java b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/after/foo/I.java
new file mode 100644
index 0000000..f0205fb
--- /dev/null
+++ b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/after/foo/I.java
@@ -0,0 +1,3 @@
+package foo;
+public interface I {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/C1.java b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/C1.java
new file mode 100644
index 0000000..f00e66d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/C1.java
@@ -0,0 +1,8 @@
+/**
+ * C1.java - Safe-delete bug example
+ */
+package foo;
+
+public class C1 {
+ C<caret>1 fooo;
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/I.java b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/I.java
new file mode 100644
index 0000000..f0205fb
--- /dev/null
+++ b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/I.java
@@ -0,0 +1,3 @@
+package foo;
+public interface I {
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java
index f2a6e3a..e6c8ec1 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java
@@ -205,6 +205,9 @@
public void testIDEA99347() { doTest5(false); }
public void testIDEA86875() { doTest5(false); }
public void testIDEA103760(){ doTest5(false); }
+ public void testIDEA105846(){ doTest5(false); }
+ public void testIDEA105695(){ doTest5(false); }
+ public void testIDEA104992(){ doTest5(false); }
public void testWildcardsOnRawTypes() { doTest5(false); }
public void testDisableWithinBoundsCheckForSuperWildcards() {
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
index 0e400c1..c31cce3 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
@@ -28,24 +28,19 @@
import org.jetbrains.annotations.NotNull;
/**
- * This class is for "lightweight" tests only, i.e. those which can run inside default light project set up
- * For "heavyweight" tests use AdvHighlightingTest
+ * This class is for "lightweight" tests only, i.e. those which can run inside default light project set up.
+ * For "heavyweight" tests use AdvHighlightingTest.
*/
public class LightAdvHighlightingJdk6Test extends LightDaemonAnalyzerTestCase {
@NonNls static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/advHighlighting6";
private void doTest(boolean checkWarnings, boolean checkInfos, Class<?>... classes) {
- setLanguageLevel(LanguageLevel.JDK_1_6);
+ setLanguageLevel(LanguageLevel.JDK_1_6);
((JavaVersionServiceImpl)JavaVersionService.getInstance()).setTestVersion(JavaSdkVersion.JDK_1_6, myTestRootDisposable);
enableInspectionTools(classes);
doTest(BASE_PATH + "/" + getTestName(false) + ".java", checkWarnings, checkInfos);
}
- private void doTest(boolean checkWarnings, boolean checkWeakWarnings, boolean checkInfos, Class<?>... classes) {
- enableInspectionTools(classes);
- doTest(BASE_PATH + "/" + getTestName(false) + ".java", checkWarnings, checkWeakWarnings, checkInfos);
- }
-
@NotNull
@Override
protected LocalInspectionTool[] configureLocalInspectionTools() {
@@ -57,6 +52,6 @@
};
}
- public void testJavacQuirks() throws Exception { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(true, false); }
- public void testMethodReturnTypeSubstitutability() throws Exception { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(true, false); }
+ public void testJavacQuirks() { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(true, false); }
+ public void testMethodReturnTypeSubstitutability() { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(true, false); }
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java
index f68f93c..b1217dd 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -241,7 +241,7 @@
};
point.registerExtension(extension);
-
+
try {
UnusedDeclarationInspection deadCodeInspection = new UnusedDeclarationInspection();
enableInspectionTool(deadCodeInspection);
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java
index dab1d63..e77dff3 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java
@@ -29,6 +29,7 @@
public void testInheritDefaultMethodInInterface() { doTest(false, false); }
public void testStaticMethodsInFunctionalInterface() { doTest(false, false); }
public void testCyclicSubstitutor() { doTest(false, false); }
+ public void testThisAccessibility() { doTest(false, false); }
private void doTest() {
doTest(false, false);
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java
new file mode 100644
index 0000000..17d7bd1
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.codeInsight.daemon.lambda;
+
+import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase;
+import com.intellij.codeInspection.LocalInspectionTool;
+import com.intellij.codeInspection.redundantCast.RedundantCastInspection;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+
+public class LambdaRedundantCastTest extends LightDaemonAnalyzerTestCase {
+ @NonNls static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/lambda/redundantCast";
+
+ @NotNull
+ @Override
+ protected LocalInspectionTool[] configureLocalInspectionTools() {
+ return new LocalInspectionTool[]{
+ new RedundantCastInspection()
+ };
+ }
+
+ public void testIntersection() { doTest(); }
+ public void testSer() { doTest(); }
+ private void doTest() {
+ doTest(BASE_PATH + "/" + getTestName(false) + ".java", true, false);
+ }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddSingleStaticImportActionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddSingleStaticImportActionTest.java
index d7bacf2..9ecdd1c 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddSingleStaticImportActionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddSingleStaticImportActionTest.java
@@ -30,6 +30,45 @@
myFixture.checkResultByFile(getTestName(false) + "_after.java");
}
+ public void testInsideParameterizedReference() {
+ myFixture.addClass("package foo; " +
+ "public class Class1 {" +
+ " public static class Inner1 {}\n" +
+ " public static class Inner2<T> {}" +
+ "}");
+ myFixture.configureByFile(getTestName(false) + ".java");
+
+ final IntentionAction intentionAction = myFixture.findSingleIntention("Add static import for 'foo.Class1.Inner2'");
+ assertNotNull(intentionAction);
+ myFixture.launchAction(intentionAction);
+ myFixture.checkResultByFile(getTestName(false) + "_after.java");
+ }
+
+ public void testInsideParameterizedReferenceInsideParameterizedReference() {
+ myFixture.addClass("package foo; " +
+ "public class Class1 {" +
+ " public static class Inner1 {}\n" +
+ " public static class Inner2<T> {}" +
+ "}");
+ myFixture.configureByFile(getTestName(false) + ".java");
+
+ final IntentionAction intentionAction = myFixture.findSingleIntention("Add static import for 'foo.Class1.Inner1'");
+ assertNotNull(intentionAction);
+ myFixture.launchAction(intentionAction);
+ myFixture.checkResultByFile(getTestName(false) + "_after.java");
+ }
+
+ public void testDisabledInsideParameterizedReference() {
+ myFixture.addClass("package foo; " +
+ "public class Class1 {" +
+ " public static <T> T foo(){return null;}\n" +
+ "}");
+ myFixture.configureByFile(getTestName(false) + ".java");
+
+ final IntentionAction intentionAction = myFixture.getAvailableIntention("Add static import for 'foo.Class1.foo'");
+ assertNull(intentionAction);
+ }
+
@Override
protected String getTestDataPath() {
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/psi/AnnotatedTypeTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/psi/AnnotatedTypeTest.groovy
index cbaa56d..f186f9e 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/psi/AnnotatedTypeTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/psi/AnnotatedTypeTest.groovy
@@ -19,7 +19,7 @@
import com.intellij.psi.PsiFile
import com.intellij.testFramework.LightIdeaTestCase
-@SuppressWarnings(["GrUnresolvedAccess"])
+@SuppressWarnings(["GrUnresolvedAccess", "GroovyAssignabilityCheck"])
class AnnotatedTypeTest extends LightIdeaTestCase {
public void testTypeComposition() {
@@ -55,6 +55,9 @@
psi = javaFacade.elementFactory.createStatementFromText("@A java.lang.@TA(1) String s", context)
assertEquals("@TA(1) String", psi.declaredElements[0].type.presentableText)
+
+ psi = javaFacade.elementFactory.createStatementFromText("Collection<? extends> s", context)
+ assertEquals("Collection<?>", psi.declaredElements[0].type.presentableText)
}
}
diff --git a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy
index 9c599d9..8c750fc 100644
--- a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy
@@ -366,4 +366,26 @@
}'''
)
}
+
+ void "test multiple elements at the same line"() {
+ doTest(
+ initial: '''\
+class Test {
+ int i;int getI() {
+ return i;
+ }int j;int getJ() {
+ return j;
+ }
+}''',
+ rules: [rule(FIELD), rule(METHOD)],
+ expected: '''\
+class Test {
+ int i;int j;int getI() {
+ return i;
+ }int getJ() {
+ return j;
+ }
+}'''
+ )
+ }
}
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java
index 0199e1a..1e287b2 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java
@@ -6,6 +6,7 @@
import com.intellij.JavaTestUtil;
import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
@@ -42,10 +43,16 @@
}
private void doTestMethod(final String methodName, final String conflicts) throws Exception {
+ doTestMethod(methodName, conflicts, "Test");
+ }
+
+ private void doTestMethod(final String methodName,
+ final String conflicts,
+ final String qualifiedName) throws Exception {
doTest(new PerformAction() {
@Override
public void performAction(final VirtualFile rootDir, final VirtualFile rootAfter) throws Exception {
- PsiClass aClass = myJavaFacade.findClass("Test", GlobalSearchScope.projectScope(myProject));
+ PsiClass aClass = myJavaFacade.findClass(qualifiedName, GlobalSearchScope.projectScope(myProject));
assertNotNull("Class Test not found", aClass);
@@ -101,6 +108,14 @@
doTestMethod();
}
+ public void testImplicitReferenceTypeParameters() throws Exception {
+ doTestMethod();
+ }
+
+ public void testStaticImports() throws Exception {
+ doTestMethod("foo", null, "foo.Test");
+ }
+
public void testNoConstructorParams() throws Exception {
doTestFieldAndMethod();
}
@@ -161,7 +176,8 @@
private static void doTest(final PsiClass aClass, final ArrayList<PsiMethod> methods, final ArrayList<PsiField> fields, final String conflicts,
boolean generateGettersSetters) {
try {
- ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", null, "Extracted", null, generateGettersSetters, Collections.<MemberInfo>emptyList());
+ ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), StringUtil.getPackageName(aClass.getQualifiedName()), null,
+ "Extracted", null, generateGettersSetters, Collections.<MemberInfo>emptyList());
processor.run();
LocalFileSystem.getInstance().refresh(false);
FileDocumentManager.getInstance().saveAllDocuments();
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java
index 26d53d1..0a2c569 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java
@@ -2,7 +2,9 @@
import com.intellij.JavaTestUtil;
import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMember;
@@ -126,6 +128,18 @@
public void testInnerToInterface() throws Exception {
doTest("A", "B", 0);
}
+
+ public void testStaticToInterface() throws Exception {
+ final LanguageLevelProjectExtension levelProjectExtension = LanguageLevelProjectExtension.getInstance(getProject());
+ final LanguageLevel level = levelProjectExtension.getLanguageLevel();
+ try {
+ levelProjectExtension.setLanguageLevel(LanguageLevel.JDK_1_8);
+ doTest("A", "B", 0);
+ }
+ finally {
+ levelProjectExtension.setLanguageLevel(level);
+ }
+ }
public void testEscalateVisibility1() throws Exception {
doTest("A", "B", true, VisibilityUtil.ESCALATE_VISIBILITY, 0);
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/RenameSuggestionsTest.groovy b/java/java-tests/testSrc/com/intellij/refactoring/RenameSuggestionsTest.groovy
new file mode 100644
index 0000000..23aff0a
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameSuggestionsTest.groovy
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.refactoring
+import com.intellij.codeInsight.TargetElementUtilBase
+import com.intellij.codeInsight.lookup.LookupElement
+import com.intellij.codeInsight.lookup.LookupEx
+import com.intellij.codeInsight.lookup.LookupManager
+import com.intellij.codeInsight.template.impl.TemplateManagerImpl
+import com.intellij.codeInsight.template.impl.TemplateState
+import com.intellij.psi.PsiElement
+import com.intellij.refactoring.rename.inplace.VariableInplaceRenameHandler
+import com.intellij.testFramework.LightCodeInsightTestCase
+/**
+ * User: anna
+ */
+class RenameSuggestionsTest extends LightCodeInsightTestCase {
+ public void "test by parameter name"() {
+ def text = """\
+ class Test {
+ void foo(int foo) {}
+ {
+ int bar = 0;
+ foo(b<caret>ar);
+ }
+ }
+ }
+ """
+
+ doTestSuggestionAvailable(text, "foo")
+ }
+
+ public void "test by super parameter name"() {
+ def text = """\
+ class Test {
+ void foo(int foo) {}
+ }
+
+ class TestImpl extends Test {
+ void foo(int foo<caret>1) {}
+ }
+ }
+ """
+
+ doTestSuggestionAvailable(text, "foo")
+ }
+
+ private doTestSuggestionAvailable(String text, String suggestion) {
+ configure text
+ def oldPreselectSetting = myEditor.settings.preselectRename
+ try {
+ TemplateManagerImpl.setTemplateTesting(getProject(), getTestRootDisposable());
+ final PsiElement element = TargetElementUtilBase.findTargetElement(myEditor, TargetElementUtilBase.getInstance().getAllAccepted())
+
+ assertNotNull(element)
+
+ VariableInplaceRenameHandler handler = new VariableInplaceRenameHandler()
+
+
+ handler.doRename(element, editor, null);
+
+ LookupEx lookup = LookupManager.getActiveLookup(editor)
+ assertNotNull(lookup)
+ boolean found = false;
+ for (LookupElement item : lookup.items) {
+ if (item.getLookupString().equals(suggestion)) {
+ found = true
+ break
+ }
+ }
+
+ if (!found) {
+ fail(suggestion + " not suggested")
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace()
+ }
+ finally {
+ myEditor.settings.preselectRename = oldPreselectSetting
+
+ TemplateState state = TemplateManagerImpl.getTemplateState(editor)
+
+ assertNotNull(state)
+
+ state.gotoEnd(false)
+ }
+ }
+
+ private def configure(String text) {
+ configureFromFileText("a.java", text)
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java
index 0f29053..9c1cf49 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java
@@ -70,6 +70,12 @@
doTest("C2");
}
+
+ public void testTopLevelDocComment() throws Exception {
+ myDoCompare = false;
+ doTest("foo.C1");
+ }
+
public void testTopParameterInHierarchy() throws Exception {
myDoCompare = false;
doTest("I");
diff --git a/java/jdkAnnotations/java/util/annotations.xml b/java/jdkAnnotations/java/util/annotations.xml
index 8ac6451..47962ab 100644
--- a/java/jdkAnnotations/java/util/annotations.xml
+++ b/java/jdkAnnotations/java/util/annotations.xml
@@ -858,7 +858,7 @@
<annotation name="org.jetbrains.annotations.NotNull" />
</item>
<item name="java.util.SortedSet java.util.Comparator<? super E> comparator()">
- <annotation name="org.jetbrains.annotations.NotNull" />
+ <annotation name="org.jetbrains.annotations.Nullable" />
</item>
<item name="java.util.SortedSet java.util.SortedSet<E> headSet(E)">
<annotation name="org.jetbrains.annotations.NotNull" />
diff --git a/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java b/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java
index 42bba52..3202197 100644
--- a/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java
+++ b/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java
@@ -241,7 +241,9 @@
PsiManager manager = methodExpr.getManager();
PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
- PsiMethodCallExpression newCall = (PsiMethodCallExpression)factory.createExpressionFromText(methodCall.getText(), methodCall);
+ final PsiExpression expressionFromText = factory.createExpressionFromText(methodCall.getText(), methodCall);
+ if (!(expressionFromText instanceof PsiMethodCallExpression)) return;
+ PsiMethodCallExpression newCall = (PsiMethodCallExpression)expressionFromText;
PsiExpression newQualifier = newCall.getMethodExpression().getQualifierExpression();
PsiExpression newOperand = ((PsiTypeCastExpression)((PsiParenthesizedExpression)newQualifier).getExpression()).getOperand();
newQualifier.replace(newOperand);
@@ -543,6 +545,24 @@
if (opType instanceof PsiClassType && ((PsiClassType)opType).hasParameters()) return true;
}
+ if (operand instanceof PsiLambdaExpression || operand instanceof PsiMethodReferenceExpression) {
+ if (castType instanceof PsiClassType && InheritanceUtil.isInheritor(PsiUtil.resolveClassInType(castType), CommonClassNames.JAVA_IO_SERIALIZABLE)) return true;
+ if (castType instanceof PsiIntersectionType) {
+ boolean redundant = false;
+ final PsiType[] conjuncts = ((PsiIntersectionType)castType).getConjuncts();
+ for (int i = 1; i < conjuncts.length; i++) {
+ PsiType conjunct = conjuncts[i];
+ if (TypeConversionUtil.isAssignable(conjuncts[0], conjunct)) {
+ redundant = true;
+ break;
+ }
+ }
+ if (!redundant) {
+ return true;
+ }
+ }
+ }
+
PsiElement parent = typeCast.getParent();
while(parent instanceof PsiParenthesizedExpression) parent = parent.getParent();