diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java
index 0e8f314847b5..0dbb2f44ac76 100644
--- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java
+++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java
@@ -730,16 +730,9 @@ public class JavaCompletionUtil {
if (psiClass.isValid() && !psiClass.getManager().areElementsEquivalent(psiClass, resolveReference(ref))) {
final boolean staticImport = ref instanceof PsiImportStaticReferenceElement;
- CodeEditUtil.setAllowSuspendNodesReformatting(true);
- PsiElement newElement;
- try {
- newElement = staticImport
- ? ((PsiImportStaticReferenceElement)ref).bindToTargetClass(psiClass)
- : ref.bindToElement(psiClass);
- }
- finally {
- CodeEditUtil.setAllowSuspendNodesReformatting(false);
- }
+ PsiElement newElement = staticImport
+ ? ((PsiImportStaticReferenceElement)ref).bindToTargetClass(psiClass)
+ : ref.bindToElement(psiClass);
newElement = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(newElement);
if (newElement != null) {
diff --git a/java/java-impl/src/com/intellij/refactoring/psi/PropertyUtils.java b/java/java-impl/src/com/intellij/refactoring/psi/PropertyUtils.java
index 47f7ac6d3098..44fc7a5725b0 100644
--- a/java/java-impl/src/com/intellij/refactoring/psi/PropertyUtils.java
+++ b/java/java-impl/src/com/intellij/refactoring/psi/PropertyUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2011 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.
@@ -95,7 +95,14 @@ public class PropertyUtils {
}
final PsiReferenceExpression reference = (PsiReferenceExpression)value;
final PsiExpression qualifier = reference.getQualifierExpression();
- if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) {
+ if (qualifier instanceof PsiReferenceExpression) {
+ final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifier;
+ final PsiElement target = referenceExpression.resolve();
+ if (!(target instanceof PsiClass)) {
+ return null;
+ }
+ }
+ else if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) {
return null;
}
final PsiElement referent = reference.resolve();
@@ -171,7 +178,14 @@ public class PropertyUtils {
}
final PsiReferenceExpression reference = (PsiReferenceExpression)lhs;
final PsiExpression qualifier = reference.getQualifierExpression();
- if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) {
+ if (qualifier instanceof PsiReferenceExpression) {
+ final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifier;
+ final PsiElement target = referenceExpression.resolve();
+ if (!(target instanceof PsiClass)) {
+ return null;
+ }
+ }
+ else if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) {
return null;
}
final PsiElement referent = reference.resolve();
@@ -216,4 +230,67 @@ public class PropertyUtils {
public static boolean isSimpleSetter(PsiMethod method) {
return getFieldOfSetter(method) != null;
}
+
+ @Nullable
+ public static PsiMethod getReversePropertyMethod(PsiMethod propertyMethod) {
+ if (propertyMethod == null) {
+ return null;
+ }
+ final PsiClass aClass = propertyMethod.getContainingClass();
+ if (aClass == null) {
+ return null;
+ }
+ final String methodName = propertyMethod.getName();
+ final String prefix;
+ if (methodName.startsWith("get")) {
+ prefix = "get";
+ }
+ else if (methodName.startsWith("is")) {
+ prefix = "is";
+ }
+ else if (methodName.startsWith("set")) {
+ prefix = "set";
+ }
+ else {
+ throw new IllegalArgumentException("argument is not a setter or getter");
+ }
+ final String name = methodName.substring(prefix.length());
+ final PsiField field;
+ if (prefix.equals("set")) {
+ field = PropertyUtils.getFieldOfSetter(propertyMethod);
+ }
+ else {
+ field = PropertyUtils.getFieldOfGetter(propertyMethod);
+ }
+ if (field == null) {
+ return null;
+ }
+ if (prefix.equals("set")) {
+ final PsiMethod result = findPropertyMethod(aClass, "get", name, field);
+ if (result != null) {
+ return result;
+ }
+ return findPropertyMethod(aClass, "is", name, field);
+ }
+ else {
+ return findPropertyMethod(aClass, "set", name, field);
+ }
+ }
+
+ private static PsiMethod findPropertyMethod(PsiClass aClass, String prefix, String propertyName, PsiField field1) {
+ final PsiMethod[] methods = aClass.findMethodsByName(prefix + propertyName, true);
+ for (PsiMethod method : methods) {
+ final PsiField field2;
+ if (prefix.equals("set")) {
+ field2 = PropertyUtils.getFieldOfSetter(method);
+ }
+ else {
+ field2 = PropertyUtils.getFieldOfGetter(method);
+ }
+ if (field1.equals(field2)) {
+ return method;
+ }
+ }
+ return null;
+ }
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy
index b691004f3053..d05310987c1a 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy
@@ -621,7 +621,7 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase {
public void testSpacesAroundEq() throws Throwable { doTest('='); }
- public void testClassBeforeCast() throws Throwable { doTest '\n' }
+ public void _testClassBeforeCast() throws Throwable { doTest '\n' }
public void testNoAllClassesOnQualifiedReference() throws Throwable {
configureByFile(getTestName(false) + ".java");
diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java b/platform/core-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java
index 21eb2ff933df..0a9ec4e8de95 100644
--- a/platform/core-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java
+++ b/platform/core-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java
@@ -441,7 +441,7 @@ public class CodeEditUtil {
*
* - This method is called with
'false' argument;
* - Document is processed at dedicated
'try' block;
- * - This method is called with
'false' argument from 'finally' section;
+ * - This method is called with
'true' argument from 'finally' section;
*
*/
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java
index 419d88935ad3..4ed85cc4e528 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/EndHandler.java
@@ -36,6 +36,7 @@ public class EndHandler extends EditorActionHandler {
return;
}
+ lookup.markSelectionTouched();
ListScrollingUtil.moveEnd(lookup.getList());
}
}
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java
index a8699b9454c8..3e742eb90e94 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/HomeHandler.java
@@ -36,6 +36,7 @@ public class HomeHandler extends EditorActionHandler {
return;
}
+ lookup.markSelectionTouched();
ListScrollingUtil.moveHome(lookup.getList());
}
}
diff --git a/platform/platform-api/src/com/intellij/util/ui/UpDownHandler.java b/platform/lang-impl/src/com/intellij/util/ui/UpDownHandler.java
similarity index 66%
rename from platform/platform-api/src/com/intellij/util/ui/UpDownHandler.java
rename to platform/lang-impl/src/com/intellij/util/ui/UpDownHandler.java
index 6a2b94d393f5..a05102599a44 100644
--- a/platform/platform-api/src/com/intellij/util/ui/UpDownHandler.java
+++ b/platform/lang-impl/src/com/intellij/util/ui/UpDownHandler.java
@@ -15,10 +15,14 @@
*/
package com.intellij.util.ui;
+import com.intellij.codeInsight.lookup.LookupEx;
+import com.intellij.codeInsight.lookup.LookupManager;
import com.intellij.ide.ui.UISettings;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CustomShortcutSet;
+import com.intellij.openapi.editor.impl.EditorComponentImpl;
+import com.intellij.ui.EditorTextField;
import javax.swing.*;
@@ -36,22 +40,12 @@ public class UpDownHandler {
register(input, affectedComponent, true);
}
- public static void register(JComponent input, final JComponent affectedComponent, boolean registerOnBothComponents) {
+ public static void register(final JComponent input, final JComponent affectedComponent, boolean registerOnBothComponents) {
final SelectionMover mover = new SelectionMover(affectedComponent);
- final AnAction up = new AnAction("Up") {
- @Override
- public void actionPerformed(AnActionEvent e) {
- mover.move(-1);
- }
- };
+ final AnAction up = new UpDownAction(mover, input, true);
up.registerCustomShortcutSet(UP_KEY, input);
-
- final AnAction down = new AnAction("Down") {
- @Override
- public void actionPerformed(AnActionEvent e) {
- mover.move(1);
- }
- };
+
+ final AnAction down = new UpDownAction(mover, input, false);
down.registerCustomShortcutSet(DOWN_KEY, input);
if (registerOnBothComponents) {
up.registerCustomShortcutSet(UP_KEY, affectedComponent);
@@ -103,4 +97,36 @@ public class UpDownHandler {
}
}
}
+
+ static class UpDownAction extends AnAction {
+ private final int myDirection;
+ private final SelectionMover myMover;
+ private final JComponent myInput;
+
+ UpDownAction(SelectionMover mover, JComponent input, boolean isUp) {
+ super(isUp ? "Up" : "Down");
+ myMover = mover;
+ myInput = input;
+ myDirection = isUp ? -1 : 1;
+ }
+
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ myMover.move(myDirection);
+ }
+
+ @Override
+ public void update(AnActionEvent e) {
+ final LookupEx lookup;
+ if (myInput instanceof EditorTextField) {
+ lookup = LookupManager.getActiveLookup(((EditorTextField)myInput).getEditor());
+ } else if (myInput instanceof EditorComponentImpl) {
+ lookup = LookupManager.getActiveLookup(((EditorComponentImpl)myInput).getEditor());
+ } else {
+ lookup = null;
+ }
+
+ e.getPresentation().setEnabled(lookup == null);
+ }
+ }
}
diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/expression/FlipSetterCallIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/expression/FlipSetterCallIntention.java
index 8dd58f6e008e..c83ff5dd1cfb 100644
--- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/expression/FlipSetterCallIntention.java
+++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/expression/FlipSetterCallIntention.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2011 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.
@@ -18,8 +18,9 @@ package com.siyeh.ipp.expression;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditorManager;
+import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
-import com.intellij.psi.util.PropertyUtil;
+import com.intellij.refactoring.psi.PropertyUtils;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.ipp.base.Intention;
import com.siyeh.ipp.base.PsiElementEditorPredicate;
@@ -34,113 +35,106 @@ import java.util.List;
* @author Konstantin Bulenkov
*/
public class FlipSetterCallIntention extends Intention {
- private static final PsiElementPredicate PREDICATE = new SetterCallPredicate();
protected void processIntention(@NotNull PsiElement element) throws IncorrectOperationException {
- final Editor editor = getEditorByElementIfItHasSelection(element);
- if (editor == null) {
- if (element instanceof PsiMethodCallExpression) {
- flipCall((PsiMethodCallExpression)element);
+ final Project project = element.getProject();
+ final Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor();
+ if (editor != null) {
+ final List methodCalls =
+ PsiSelectionSearcher.searchElementsInSelection(editor, project, PsiMethodCallExpression.class, false);
+ if (methodCalls.size() > 0) {
+ for (PsiMethodCallExpression call : methodCalls) {
+ flipCall(call);
+ }
+ editor.getSelectionModel().removeSelection();
+ return;
}
}
- else { // editor not null
- final List methodCalls =
- PsiSelectionSearcher.searchElementsInSelection(editor, element.getProject(), PsiMethodCallExpression.class, false);
- for (PsiMethodCallExpression call : methodCalls) {
- flipCall(call);
- }
- editor.getSelectionModel().removeSelection();
+ if (element instanceof PsiMethodCallExpression) {
+ flipCall((PsiMethodCallExpression)element);
}
}
@NotNull
protected PsiElementPredicate getElementPredicate() {
- return PREDICATE;
+ return new SetterCallPredicate();
}
private static void flipCall(PsiMethodCallExpression call) {
- PsiExpression qualifierExpression = call.getMethodExpression().getQualifierExpression();
- if (qualifierExpression == null) return;
- final String qualifier1 = qualifierExpression.getText();
- if (qualifier1 == null || qualifier1.length() == 0) return;
- final PsiMethodCallExpression param = (PsiMethodCallExpression)call.getArgumentList().getExpressions()[0];
- qualifierExpression = param.getMethodExpression().getQualifierExpression();
- if (qualifierExpression == null) return;
- final String qualifier2 = qualifierExpression.getText();
+ final PsiExpression qualifierExpression1 = call.getMethodExpression().getQualifierExpression();
+ if (qualifierExpression1 == null) {
+ return;
+ }
+ final PsiExpression[] arguments = call.getArgumentList().getExpressions();
+ if (arguments.length != 1) {
+ return;
+ }
+ final PsiExpression argument = arguments[0];
+ if (!(argument instanceof PsiMethodCallExpression)) {
+ return;
+ }
+ final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)argument;
+ final PsiExpression qualifierExpression2 = methodCallExpression.getMethodExpression().getQualifierExpression();
+ if (qualifierExpression2 == null) {
+ return;
+ }
final PsiMethod setter = call.resolveMethod();
- final PsiMethod getter = param.resolveMethod();
-
- if (getter == null || setter == null) return;
-
- final PsiMethod get = PropertyUtil.findPropertyGetter(setter.getContainingClass(), PropertyUtil.getPropertyName(setter), false, true);
- final PsiMethod set = PropertyUtil.findPropertySetter(getter.getContainingClass(), PropertyUtil.getPropertyName(getter), false, true);
-
- if (get == null || set == null) return;
-
- StringBuilder text = new StringBuilder();
- text.append(qualifier2).append(".").append(set.getName())
- .append("(")
- .append(qualifier1).append(".").append(get.getName()).append("()")
- .append(")");
- final PsiExpression newExpression =
- JavaPsiFacade.getElementFactory(call.getProject()).createExpressionFromText(text.toString(), call.getContext());
+ final PsiMethod getter = methodCallExpression.resolveMethod();
+ final PsiMethod get = PropertyUtils.getReversePropertyMethod(setter);
+ final PsiMethod set = PropertyUtils.getReversePropertyMethod(getter);
+ if (get == null || set == null) {
+ return;
+ }
+ final String text =
+ qualifierExpression2.getText() + "." + set.getName() + "(" + qualifierExpression1.getText() + "." + get.getName() + "())";
+ final PsiExpression newExpression = JavaPsiFacade.getElementFactory(call.getProject()).createExpressionFromText(text, call);
call.replace(newExpression);
}
- private static boolean isSetGetMethodCall(PsiMethodCallExpression call) {
- final PsiExpression[] params = call.getArgumentList().getExpressions();
- if (params.length != 1) return false;
- if (!(params[0] instanceof PsiMethodCallExpression)) return false;
- final PsiMethodCallExpression call2 = (PsiMethodCallExpression)params[0];
-
- //check expressions are simple properties
- final PsiElement methodElement = call.getMethodExpression().resolve();
- final PsiElement param = call2.getMethodExpression().resolve();
- if (!(methodElement instanceof PsiMethod)
- || !(param instanceof PsiMethod)
- || !PropertyUtil.isSimplePropertySetter((PsiMethod)methodElement)
- || !PropertyUtil.isSimplePropertyGetter((PsiMethod)param)) {
+ private static boolean isSetGetMethodCall(PsiElement element) {
+ if (!(element instanceof PsiMethodCallExpression)) {
+ return false;
+ }
+ final PsiMethodCallExpression call1 = (PsiMethodCallExpression)element;
+ final PsiExpression[] arguments = call1.getArgumentList().getExpressions();
+ if (arguments.length != 1) {
+ return false;
+ }
+ final PsiExpression argument = arguments[0];
+ if (!(argument instanceof PsiMethodCallExpression)) {
+ return false;
+ }
+ final PsiMethodCallExpression call2 = (PsiMethodCallExpression)argument;
+ final PsiMethod setter = call1.resolveMethod();
+ final PsiMethod getter = call2.resolveMethod();
+ final PsiMethod get = PropertyUtils.getReversePropertyMethod(setter);
+ final PsiMethod set = PropertyUtils.getReversePropertyMethod(getter);
+ if (setter == null || getter == null || get == null || set == null) {
return false;
}
- final PsiMethod setter1 = (PsiMethod)methodElement;
- final PsiMethod getter2 = (PsiMethod)param;
//check types compatibility
- if (!call.getArgumentList().getExpressionTypes()[0].equals(getter2.getReturnType())) return false;
-
- //check both classes have getters/setters
- final PsiMethod getter1 =
- PropertyUtil.findPropertyGetter(setter1.getContainingClass(), PropertyUtil.getPropertyName(setter1), false, true);
- if (getter1 == null) return false;
-
- final PsiMethod setter2 =
- PropertyUtil.findPropertyGetter(getter2.getContainingClass(), PropertyUtil.getPropertyName(getter2), false, true);
- if (setter2 == null) return false;
-
- return true;
- }
-
- @Nullable
- private static Editor getEditorByElementIfItHasSelection(@NotNull PsiElement element) {
- final Editor editor = FileEditorManager.getInstance(element.getProject()).getSelectedTextEditor();
- return editor != null && editor.getSelectionModel().hasSelection() ? editor : null;
+ final PsiParameter[] parameters = setter.getParameterList().getParameters();
+ if (parameters.length != 1) {
+ return false;
+ }
+ final PsiParameter parameter = parameters[0];
+ return parameter.getType().equals(getter.getReturnType());
}
private static class SetterCallPredicate extends PsiElementEditorPredicate {
@Override
public boolean satisfiedBy(PsiElement element, @Nullable Editor editor) {
- boolean underCorrectElement = element instanceof PsiMethodCallExpression && isSetGetMethodCall((PsiMethodCallExpression)element);
- if (editor == null || !editor.getSelectionModel().hasSelection()) {
- return underCorrectElement;
+ if (editor != null && editor.getSelectionModel().hasSelection()) {
+ final List list =
+ PsiSelectionSearcher.searchElementsInSelection(editor, element.getProject(), PsiMethodCallExpression.class, false);
+ for (PsiMethodCallExpression methodCallExpression : list) {
+ if (isSetGetMethodCall(methodCallExpression)) {
+ return true;
+ }
+ }
}
-
- final List list =
- PsiSelectionSearcher.searchElementsInSelection(editor, element.getProject(), PsiMethodCallExpression.class, false);
- for (PsiMethodCallExpression methodCallExpression : list) {
- if (isSetGetMethodCall(methodCallExpression)) return true;
- }
-
- return underCorrectElement;
+ return isSetGetMethodCall(element);
}
}
}
diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/PsiSelectionSearcher.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/PsiSelectionSearcher.java
index f4e24f8a4613..e0579aa347cb 100644
--- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/PsiSelectionSearcher.java
+++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/psiutils/PsiSelectionSearcher.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2011 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.
@@ -17,6 +17,7 @@
package com.siyeh.ipp.psiutils;
import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.editor.SelectionModel;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
@@ -39,7 +40,7 @@ public class PsiSelectionSearcher {
* @param editor editor to get text selection
* @param project Project
* @param filter PsiElement filter, e.g. PsiMethodCallExpression.class
- * @param dontStopOnFound if true, visitor will look inside found elements. if false, visitor will stop looking for elements in children of found element
+ * @param searchChildrenOfFound if true, visitor will look for matching elements in the children of a found element, otherwise will not look inside found element.
* @param type based on PsiElement type
* @return elements in selection
*/
@@ -47,28 +48,31 @@ public class PsiSelectionSearcher {
public static List searchElementsInSelection(Editor editor,
Project project,
final Class filter,
- final boolean dontStopOnFound) {
- final TextRange selection = new TextRange(editor.getSelectionModel().getSelectionStart(), editor.getSelectionModel().getSelectionEnd());
-
+ final boolean searchChildrenOfFound) {
+ final SelectionModel selectionModel = editor.getSelectionModel();
+ if (!selectionModel.hasSelection()) {
+ return Collections.emptyList();
+ }
+ final TextRange selection = new TextRange(selectionModel.getSelectionStart(), selectionModel.getSelectionEnd());
final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
- if (file == null || file instanceof PsiCompiledElement) return Collections.emptyList();
-
+ if (file == null || file instanceof PsiCompiledElement) {
+ return Collections.emptyList();
+ }
final List results = new ArrayList();
final PsiElementVisitor visitor = new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitElement(PsiElement element) {
- if (!selection.intersects(element.getTextRange())) return;
-
+ if (!selection.intersects(element.getTextRange())) {
+ return;
+ }
if (filter.isAssignableFrom(element.getClass())) {
results.add((T)element);
- if (dontStopOnFound) {
- super.visitElement(element);
+ if (!searchChildrenOfFound) {
+ return;
}
}
- else {
- super.visitElement(element);
- }
+ super.visitElement(element);
}
};
diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java
index a5222ce3f74a..f71dbb397779 100644
--- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java
+++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java
@@ -739,8 +739,12 @@ public class AndroidCompileUtil {
throws IOException {
if (file.isDirectory()) {
- for (File child : file.listFiles()) {
- addFileToJar(jar, child, rootDirectory, packRClasses);
+ final File[] children = file.listFiles();
+
+ if (children != null) {
+ for (File child : children) {
+ addFileToJar(jar, child, rootDirectory, packRClasses);
+ }
}
}
else if (file.isFile()) {
diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java
index a12daa8df257..4e6e537b16df 100644
--- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java
+++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java
@@ -139,14 +139,18 @@ public class AndroidPrecompileTask implements CompileTask {
private static void removeAllPackages(@Nullable String sourceRootPath, @NotNull CompileContext context) {
final File sourceRoot = new File(sourceRootPath);
- for (File child : sourceRoot.listFiles()) {
- if (child.isDirectory() &&
- child.getName() != null &&
- StringUtil.isJavaIdentifier(child.getName())) {
+ final File[] children = sourceRoot.listFiles();
- if (!FileUtil.delete(child)) {
- context.addMessage(CompilerMessageCategory.ERROR, "Cannot delete file " + child.getAbsolutePath(),
- null, -1, -1);
+ if (children != null) {
+ for (File child : children) {
+ if (child.isDirectory() &&
+ child.getName() != null &&
+ StringUtil.isJavaIdentifier(child.getName())) {
+
+ if (!FileUtil.delete(child)) {
+ context.addMessage(CompilerMessageCategory.ERROR, "Cannot delete file " + child.getAbsolutePath(),
+ null, -1, -1);
+ }
}
}
}
diff --git a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java b/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java
index 7fd1c36e7179..93a1905e390c 100644
--- a/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java
+++ b/plugins/android/src/org/jetbrains/android/compiler/tools/AndroidDxRunner.java
@@ -157,8 +157,12 @@ public class AndroidDxRunner {
}
if (file.isDirectory()) {
- for (File child : file.listFiles()) {
- collectFiles(root, child, result, visited, qNames);
+ final File[] children = file.listFiles();
+
+ if (children != null) {
+ for (File child : children) {
+ collectFiles(root, child, result, visited, qNames);
+ }
}
}
else {
diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java
index b515b1cf7964..836dfb362a4f 100644
--- a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java
+++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java
@@ -253,15 +253,18 @@ public class AndroidModuleBuilder extends JavaModuleBuilder {
AndroidUtils.runExternalTool(project, commandLine, true, null);
if (finalTempContentRoot != null) {
- for (File child : finalTempContentRoot.listFiles()) {
+ final File[] children = finalTempContentRoot.listFiles();
- if (SdkConstants.FD_SOURCES.equals(child.getName())) {
- continue;
- }
- final File to = new File(contentRoot.getPath(), child.getName());
+ if (children != null) {
+ for (File child : children) {
+ if (SdkConstants.FD_SOURCES.equals(child.getName())) {
+ continue;
+ }
+ final File to = new File(contentRoot.getPath(), child.getName());
- if (!FileUtil.moveDirWithContent(child, to)) {
- LOG.error("Cannot move content from " + child.getPath() + " to " + to.getPath());
+ if (!FileUtil.moveDirWithContent(child, to)) {
+ LOG.error("Cannot move content from " + child.getPath() + " to " + to.getPath());
+ }
}
}
diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java
index d37f4e5b992c..d0ae0d69c90d 100644
--- a/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java
+++ b/plugins/android/src/org/jetbrains/android/resourceManagers/LocalResourceManager.java
@@ -72,7 +72,7 @@ public class LocalResourceManager extends ResourceManager {
@Override
public VirtualFile[] getAllResourceDirs() {
Set result = new HashSet();
- collectResourceDirs(getModule(), result);
+ collectResourceDirs(getModule(), result, new HashSet());
return VfsUtil.toVirtualFileArray(result);
}
@@ -101,13 +101,17 @@ public class LocalResourceManager extends ResourceManager {
return AndroidRootUtil.getResourceOverlayDirs(getModule());
}
- private static void collectResourceDirs(Module module, Set result) {
+ private static void collectResourceDirs(Module module, Set result, Set visited) {
+ if (!visited.add(module)) {
+ return;
+ }
+
VirtualFile resDir = AndroidRootUtil.getResourceDir(module);
if (resDir != null && !result.add(resDir)) {
return;
}
for (AndroidFacet depFacet : AndroidUtils.getAllAndroidDependencies(module, false)) {
- collectResourceDirs(depFacet.getModule(), result);
+ collectResourceDirs(depFacet.getModule(), result, visited);
}
}
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AutoCloneContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AutoCloneContributor.java
index a293b17f52f0..f5259848482b 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AutoCloneContributor.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AutoCloneContributor.java
@@ -16,6 +16,7 @@
package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.intellij.psi.PsiMethod;
+import com.intellij.psi.PsiModifier;
import com.intellij.psi.impl.light.LightMethodBuilder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
@@ -34,7 +35,7 @@ public class AutoCloneContributor extends AstTransformContributor {
public void collectMethods(@NotNull GrTypeDefinition clazz, Collection collector) {
if (PsiImplUtil.getAnnotation(clazz, GroovyCommonClassNames.GROOVY_TRANSFORM_AUTO_CLONE) == null) return;
- final LightMethodBuilder clone = new LightMethodBuilder(clazz.getManager(), "clone");
+ final LightMethodBuilder clone = new LightMethodBuilder(clazz.getManager(), "clone").addModifier(PsiModifier.PUBLIC);
clone.setContainingClass(clazz);
clone.addException(CloneNotSupportedException.class.getName());
collector.add(clone);
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java
index 2fc202956d5f..78faf0301610 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java
@@ -57,6 +57,7 @@ public class DelegatedMethodsContributor extends AstTransformContributor {
for (PsiMethod method : methods) {
if (method.isConstructor()) continue;
if (!deprecated && PsiImplUtil.getAnnotation(method, "java.lang.Deprecated") != null) continue;
+ if (clazz.findCodeMethodsBySignature(method, false).length > 0) continue;
collector.add(generateDelegateMethod(method, clazz, resolveResult.getSubstitutor()));
}
}
diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GeneratorTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GeneratorTest.java
index 16c36945f9ca..f3ec84ab43fb 100644
--- a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GeneratorTest.java
+++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GeneratorTest.java
@@ -102,6 +102,10 @@ public class GeneratorTest extends LightGroovyTestCase {
myFixture.addClass("package groovy.lang; public @interface Delegate {}");
doTest();
}
+ public void testAutoCloneAnno() throws Throwable {
+ myFixture.addClass("package groovy.transform; public @interface AutoClone {}");
+ doTest();
+ }
public void doTest() {
final String relTestPath = getTestName(true) + ".test";
diff --git a/plugins/groovy/testdata/groovy/stubGenerator/autoCloneAnno.test b/plugins/groovy/testdata/groovy/stubGenerator/autoCloneAnno.test
new file mode 100644
index 000000000000..fa785119a386
--- /dev/null
+++ b/plugins/groovy/testdata/groovy/stubGenerator/autoCloneAnno.test
@@ -0,0 +1,30 @@
+@groovy.transform.AutoClone
+class Foo {}
+-----
+public class Foo extends groovy.lang.GroovyObjectSupport implements groovy.lang.GroovyObject {
+public java.lang.Object clone() throws java.lang.CloneNotSupportedException {
+return null;
+}
+
+public java.lang.Object getProperty(java.lang.String property) {
+return null;
+}
+
+public void setProperty(java.lang.String property, java.lang.Object newValue) {
+return ;
+}
+
+public java.lang.Object invokeMethod(java.lang.String name, java.lang.Object args) {
+return null;
+}
+
+public groovy.lang.MetaClass getMetaClass() {
+return null;
+}
+
+public void setMetaClass(groovy.lang.MetaClass metaClass) {
+return ;
+}
+
+}
+---
\ No newline at end of file
diff --git a/plugins/groovy/testdata/groovy/stubGenerator/delegateAnno.test b/plugins/groovy/testdata/groovy/stubGenerator/delegateAnno.test
index 0a4eb4ce3447..2f202cdbdd9c 100644
--- a/plugins/groovy/testdata/groovy/stubGenerator/delegateAnno.test
+++ b/plugins/groovy/testdata/groovy/stubGenerator/delegateAnno.test
@@ -9,6 +9,10 @@ class DelegateBarImpl {
private @Delegate(interfaces=false) Runnable zoo;
private @Delegate Doo doo;
}
+class Del2 implements DelegateFoo {
+ @Delegate DelegateFoo foo;
+ def foo() {}
+}
-----
public interface DelegateFoo {
public java.lang.Object foo() ;
@@ -79,4 +83,40 @@ private DelegateFoo foo = null;
private java.lang.Runnable zoo = null;
private Doo doo = null;
}
+---
+public class Del2 extends groovy.lang.GroovyObjectSupport implements DelegateFoo, groovy.lang.GroovyObject {
+public java.lang.Object foo() {
+return null;
+}
+
+public DelegateFoo getFoo() {
+return null;
+}
+
+public void setFoo(DelegateFoo foo) {
+return ;
+}
+
+public java.lang.Object getProperty(java.lang.String property) {
+return null;
+}
+
+public void setProperty(java.lang.String property, java.lang.Object newValue) {
+return ;
+}
+
+public java.lang.Object invokeMethod(java.lang.String name, java.lang.Object args) {
+return null;
+}
+
+public groovy.lang.MetaClass getMetaClass() {
+return null;
+}
+
+public void setMetaClass(groovy.lang.MetaClass metaClass) {
+return ;
+}
+
+private DelegateFoo foo = null;
+}
---
\ No newline at end of file