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 { *
    *
  1. This method is called with 'false' argument;
  2. *
  3. Document is processed at dedicated 'try' block;
  4. - *
  5. This method is called with 'false' argument from 'finally' section;
  6. + *
  7. This method is called with 'true' argument from 'finally' section;
  8. *
*/ 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