Merge remote branch 'origin/master'

This commit is contained in:
irengrig
2011-12-05 10:45:33 +04:00
19 changed files with 339 additions and 148 deletions
@@ -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) {
@@ -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;
}
}
@@ -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");
@@ -441,7 +441,7 @@ public class CodeEditUtil {
* <ol>
* <li>This method is called with <code>'false'</code> argument;</li>
* <li>Document is processed at dedicated <code>'try'</code> block;</li>
* <li>This method is called with <code>'false'</code> argument from <code>'finally'</code> section;</li>
* <li>This method is called with <code>'true'</code> argument from <code>'finally'</code> section;</li>
* </ol>
</pre>
*/
@@ -36,6 +36,7 @@ public class EndHandler extends EditorActionHandler {
return;
}
lookup.markSelectionTouched();
ListScrollingUtil.moveEnd(lookup.getList());
}
}
@@ -36,6 +36,7 @@ public class HomeHandler extends EditorActionHandler {
return;
}
lookup.markSelectionTouched();
ListScrollingUtil.moveHome(lookup.getList());
}
}
@@ -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);
}
}
}
@@ -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<PsiMethodCallExpression> 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<PsiMethodCallExpression> 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<PsiMethodCallExpression> list =
PsiSelectionSearcher.searchElementsInSelection(editor, element.getProject(), PsiMethodCallExpression.class, false);
for (PsiMethodCallExpression methodCallExpression : list) {
if (isSetGetMethodCall(methodCallExpression)) {
return true;
}
}
}
final List<PsiMethodCallExpression> list =
PsiSelectionSearcher.searchElementsInSelection(editor, element.getProject(), PsiMethodCallExpression.class, false);
for (PsiMethodCallExpression methodCallExpression : list) {
if (isSetGetMethodCall(methodCallExpression)) return true;
}
return underCorrectElement;
return isSetGetMethodCall(element);
}
}
}
@@ -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 <T> type based on PsiElement type
* @return elements in selection
*/
@@ -47,28 +48,31 @@ public class PsiSelectionSearcher {
public static <T extends PsiElement> List<T> searchElementsInSelection(Editor editor,
Project project,
final Class<T> 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<T> results = new ArrayList<T>();
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);
}
};
@@ -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()) {
@@ -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);
}
}
}
}
@@ -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 {
@@ -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());
}
}
}
@@ -72,7 +72,7 @@ public class LocalResourceManager extends ResourceManager {
@Override
public VirtualFile[] getAllResourceDirs() {
Set<VirtualFile> result = new HashSet<VirtualFile>();
collectResourceDirs(getModule(), result);
collectResourceDirs(getModule(), result, new HashSet<Module>());
return VfsUtil.toVirtualFileArray(result);
}
@@ -101,13 +101,17 @@ public class LocalResourceManager extends ResourceManager {
return AndroidRootUtil.getResourceOverlayDirs(getModule());
}
private static void collectResourceDirs(Module module, Set<VirtualFile> result) {
private static void collectResourceDirs(Module module, Set<VirtualFile> result, Set<Module> 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);
}
}
@@ -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<PsiMethod> 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);
@@ -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()));
}
}
@@ -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";
@@ -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 ;
}
}
---
@@ -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;
}
---