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

This commit is contained in:
irengrig
2010-01-26 17:58:13 +03:00
38 changed files with 478 additions and 230 deletions
+4 -4
View File
@@ -23,12 +23,12 @@ fi
SCRIPT_LOCATION=$0
# Step through symlinks to find where the script really is
while [ -L $SCRIPT_LOCATION ]; do
SCRIPT_LOCATION=`readlink -e $SCRIPT_LOCATION`
while [ -L "$SCRIPT_LOCATION" ]; do
SCRIPT_LOCATION=`readlink -e "$SCRIPT_LOCATION"`
done
IDEA_HOME=`dirname $SCRIPT_LOCATION`/..
IDEA_BIN_HOME=`dirname $SCRIPT_LOCATION`
IDEA_HOME=`dirname "$SCRIPT_LOCATION"`/..
IDEA_BIN_HOME=`dirname "$SCRIPT_LOCATION"`
export JAVA_HOME
export IDEA_HOME
@@ -24,26 +24,30 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.projectImport.ProjectOpenProcessor;
import com.intellij.projectImport.ProjectOpenProcessorBase;
import com.intellij.util.ArrayUtil;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class OpenProjectAction extends AnAction implements DumbAware {
public void actionPerformed(AnActionEvent e) {
Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
final Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
final FileChooserDescriptor descriptor = new OpenProjectFileChooserDescriptor(true);
descriptor.setTitle(IdeBundle.message("title.open.project"));
String [] extensions = new String[]{ProjectFileType.DOT_DEFAULT_EXTENSION};
final Set<String> extensions = new HashSet<String>();
extensions.add(ProjectFileType.DOT_DEFAULT_EXTENSION);
final ProjectOpenProcessor[] openProcessors = Extensions.getExtensions(ProjectOpenProcessorBase.EXTENSION_POINT_NAME);
for (ProjectOpenProcessor openProcessor : openProcessors) {
final String[] supportedExtensions = ((ProjectOpenProcessorBase)openProcessor).getSupportedExtensions();
if (supportedExtensions != null) {
extensions = ArrayUtil.mergeArrays(extensions, supportedExtensions, String.class);
Collections.addAll(extensions, supportedExtensions);
}
}
descriptor.setDescription(IdeBundle.message("filter.project.files", StringUtil.join(extensions, ", ")));
@@ -22,6 +22,7 @@ import com.intellij.codeInspection.*;
import com.intellij.openapi.extensions.ExtensionPoint;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.module.LanguageLevelUtil;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.pom.java.LanguageLevel;
@@ -172,25 +173,28 @@ public class Java15APIUsageInspection extends BaseJavaLocalInspectionTool {
final PsiElement resolved = reference.resolve();
if (resolved instanceof PsiCompiledElement && resolved instanceof PsiMember) {
final LanguageLevel languageLevel = LanguageLevelUtil.getEffectiveLanguageLevel(ModuleUtil.findModuleForPsiElement(reference.getElement()));
if (isForbiddenApiUsage((PsiMember)resolved, languageLevel)) {
PsiClass psiClass = null;
final PsiElement qualifier = reference.getQualifier();
if (qualifier != null) {
if (qualifier instanceof PsiExpression) {
psiClass = PsiUtil.resolveClassInType(((PsiExpression)qualifier).getType());
final Module module = ModuleUtil.findModuleForPsiElement(reference.getElement());
if (module != null) {
final LanguageLevel languageLevel = LanguageLevelUtil.getEffectiveLanguageLevel(module);
if (isForbiddenApiUsage((PsiMember)resolved, languageLevel)) {
PsiClass psiClass = null;
final PsiElement qualifier = reference.getQualifier();
if (qualifier != null) {
if (qualifier instanceof PsiExpression) {
psiClass = PsiUtil.resolveClassInType(((PsiExpression)qualifier).getType());
}
}
}
else {
psiClass = PsiTreeUtil.getParentOfType(reference, PsiClass.class);
}
if (psiClass != null) {
if (isIgnored(psiClass)) return;
for (PsiClass superClass : psiClass.getSupers()) {
if (isIgnored(superClass)) return;
else {
psiClass = PsiTreeUtil.getParentOfType(reference, PsiClass.class);
}
if (psiClass != null) {
if (isIgnored(psiClass)) return;
for (PsiClass superClass : psiClass.getSupers()) {
if (isIgnored(superClass)) return;
}
}
registerError(reference, languageLevel);
}
registerError(reference, languageLevel);
}
}
}
@@ -203,10 +207,13 @@ public class Java15APIUsageInspection extends BaseJavaLocalInspectionTool {
@Override public void visitNewExpression(final PsiNewExpression expression) {
super.visitNewExpression(expression);
final PsiMethod constructor = expression.resolveConstructor();
final LanguageLevel languageLevel = LanguageLevelUtil.getEffectiveLanguageLevel(ModuleUtil.findModuleForPsiElement(expression));
if (constructor instanceof PsiCompiledElement) {
if (isForbiddenApiUsage(constructor, languageLevel)) {
registerError(expression.getClassReference(), languageLevel);
final Module module = ModuleUtil.findModuleForPsiElement(expression);
if (module != null) {
final LanguageLevel languageLevel = LanguageLevelUtil.getEffectiveLanguageLevel(module);
if (constructor instanceof PsiCompiledElement) {
if (isForbiddenApiUsage(constructor, languageLevel)) {
registerError(expression.getClassReference(), languageLevel);
}
}
}
}
@@ -219,6 +219,7 @@ class IntroduceConstantDialog extends DialogWrapper {
myTfTargetClassName.getChildComponent().addDocumentListener(new DocumentAdapter() {
public void documentChanged(DocumentEvent e) {
targetClassChanged();
enableEnumDependant(introduceEnumConstant());
}
});
myIntroduceEnumConstantCb.addActionListener(new ActionListener() {
@@ -226,7 +227,6 @@ class IntroduceConstantDialog extends DialogWrapper {
enableEnumDependant(introduceEnumConstant());
}
});
enableEnumDependant(introduceEnumConstant());
final JPanel enumPanel = new JPanel(new BorderLayout());
enumPanel.add(myIntroduceEnumConstantCb, BorderLayout.EAST);
myTargetClassNamePanel.add(enumPanel, BorderLayout.SOUTH);
@@ -285,7 +285,7 @@ class IntroduceConstantDialog extends DialogWrapper {
}
final PsiManager psiManager = PsiManager.getInstance(myProject);
if (myTypeSelectorManager.isSuggestedType("java.lang.String") &&
if ((myTypeSelectorManager.isSuggestedType("java.lang.String") || (myLocalVariable != null && AnnotationUtil.isAnnotated(myLocalVariable, AnnotationUtil.NON_NLS, false)))&&
LanguageLevelProjectExtension.getInstance(psiManager.getProject()).getLanguageLevel().hasEnumKeywordAndAutoboxing() &&
JavaPsiFacade.getInstance(psiManager.getProject()).findClass(AnnotationUtil.NON_NLS, myParentClass.getResolveScope()) != null) {
final PropertiesComponent component = PropertiesComponent.getInstance(myProject);
@@ -306,7 +306,7 @@ class IntroduceConstantDialog extends DialogWrapper {
bg.add(myRbpackageLocal);
bg.add(myRbProtected);
bg.add(myRbPublic);
enableEnumDependant(introduceEnumConstant());
return myPanel;
}
@@ -53,11 +53,11 @@ import java.util.*;
public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.move.moveClassesOrPackages.MoveClassToInnerProcessor");
private PsiClass myClassToMove;
private PsiClass[] myClassesToMove;
private final PsiClass myTargetClass;
private PsiPackage mySourcePackage;
private PsiPackage[] mySourcePackage;
private final PsiPackage myTargetPackage;
private String mySourceVisibility;
private String[] mySourceVisibility;
private final boolean mySearchInComments;
private final boolean mySearchInNonJavaFiles;
private NonCodeUsageInfo[] myNonCodeUsages;
@@ -65,13 +65,13 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
private final MoveCallback myMoveCallback;
public MoveClassToInnerProcessor(Project project,
final PsiClass classToMove,
final PsiClass[] classesToMove,
@NotNull final PsiClass targetClass,
boolean searchInComments,
boolean searchInNonJavaFiles,
MoveCallback moveCallback) {
super(project);
setClassToMove(classToMove);
setClassesToMove(classesToMove);
myTargetClass = targetClass;
mySearchInComments = searchInComments;
mySearchInNonJavaFiles = searchInNonJavaFiles;
@@ -79,29 +79,30 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
myTargetPackage = JavaDirectoryService.getInstance().getPackage(myTargetClass.getContainingFile().getContainingDirectory());
}
private void setClassToMove(final PsiClass classToMove) {
myClassToMove = classToMove;
mySourceVisibility = VisibilityUtil.getVisibilityModifier(myClassToMove.getModifierList());
mySourcePackage = JavaDirectoryService.getInstance().getPackage(myClassToMove.getContainingFile().getContainingDirectory());
private void setClassesToMove(final PsiClass[] classesToMove) {
myClassesToMove = classesToMove;
mySourcePackage = new PsiPackage[classesToMove.length];
mySourceVisibility = new String[classesToMove.length];
for (int i = 0; i < classesToMove.length; i++) {
PsiClass psiClass = classesToMove[i];
mySourceVisibility[i] = VisibilityUtil.getVisibilityModifier(psiClass.getModifierList());
mySourcePackage[i] = JavaDirectoryService.getInstance().getPackage(psiClass.getContainingFile().getContainingDirectory());
}
}
protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) {
return new MoveClassesOrPackagesViewDescriptor(new PsiElement[] { myClassToMove },
return new MoveClassesOrPackagesViewDescriptor(myClassesToMove,
mySearchInComments, mySearchInNonJavaFiles,
myTargetClass.getQualifiedName());
}
@NotNull
public UsageInfo[] findUsages() {
List<UsageInfo> usages = new ArrayList<UsageInfo>();
String newName = myTargetClass.getQualifiedName() + "." + myClassToMove.getName();
Collections.addAll(usages, MoveClassesOrPackagesUtil.findUsages(myClassToMove, mySearchInComments,
mySearchInNonJavaFiles, newName));
for (Iterator<UsageInfo> iterator = usages.iterator(); iterator.hasNext();) {
UsageInfo usageInfo = iterator.next();
if (!(usageInfo instanceof NonCodeUsageInfo) && PsiTreeUtil.isAncestor(myClassToMove, usageInfo.getElement(), false)) {
iterator.remove();
}
final List<UsageInfo> usages = new ArrayList<UsageInfo>();
for (PsiClass classToMove : myClassesToMove) {
final String newName = myTargetClass.getQualifiedName() + "." + classToMove.getName();
Collections.addAll(usages, MoveClassesOrPackagesUtil.findUsages(classToMove, mySearchInComments,
mySearchInNonJavaFiles, newName));
}
return usages.toArray(new UsageInfo[usages.size()]);
}
@@ -111,40 +112,45 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
}
protected void refreshElements(final PsiElement[] elements) {
assert elements.length == 1;
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
setClassToMove((PsiClass)elements[0]);
final PsiClass[] classesToMove = new PsiClass[elements.length];
for (int i = 0; i < classesToMove.length; i++) {
classesToMove[i] = (PsiClass)elements[i];
}
setClassesToMove(classesToMove);
}
});
}
protected void performRefactoring(UsageInfo[] usages) {
if (!prepareWritable(usages)) return;
final List<PsiElement> importStatements = new ArrayList<PsiElement>();
if (!CodeStyleSettingsManager.getSettings(myProject).INSERT_INNER_CLASS_IMPORTS) {
usages = filterUsagesInImportStatements(usages, importStatements);
}
saveNonCodeUsages(usages);
final Map<PsiElement, PsiElement> oldToNewElementsMapping = new HashMap<PsiElement, PsiElement>();
try {
saveNonCodeUsages(usages);
ChangeContextUtil.encodeContextInfo(myClassToMove, true);
PsiClass newClass = (PsiClass)myTargetClass.addBefore(myClassToMove, myTargetClass.getRBrace());
PsiUtil.setModifierProperty(newClass, PsiModifier.STATIC, true);
newClass = (PsiClass)ChangeContextUtil.decodeContextInfo(newClass, null, null);
retargetClassRefs(myClassToMove, newClass);
final List<PsiElement> importStatements = new ArrayList<PsiElement>();
if (!CodeStyleSettingsManager.getSettings(myProject).INSERT_INNER_CLASS_IMPORTS) {
usages = filterUsagesInImportStatements(usages, importStatements);
for (PsiClass classToMove : myClassesToMove) {
ChangeContextUtil.encodeContextInfo(classToMove, true);
PsiClass newClass = (PsiClass)myTargetClass.addBefore(classToMove, myTargetClass.getRBrace());
PsiUtil.setModifierProperty(newClass, PsiModifier.STATIC, true);
newClass = (PsiClass)ChangeContextUtil.decodeContextInfo(newClass, null, null);
oldToNewElementsMapping.put(classToMove, newClass);
}
Map<PsiElement, PsiElement> oldToNewElementsMapping = new HashMap<PsiElement, PsiElement>();
oldToNewElementsMapping.put(myClassToMove, newClass);
myNonCodeUsages = MoveClassesOrPackagesProcessor.retargetUsages(usages, oldToNewElementsMapping);
retargetNonCodeUsages(newClass);
retargetNonCodeUsages(oldToNewElementsMapping);
JavaCodeStyleManager.getInstance(myProject).removeRedundantImports((PsiJavaFile)newClass.getContainingFile());
retargetClassRefsInMoved(oldToNewElementsMapping);
myClassToMove.delete();
for(PsiElement element: importStatements) {
JavaCodeStyleManager.getInstance(myProject).removeRedundantImports((PsiJavaFile)myTargetClass.getContainingFile());
for (PsiClass classToMove : myClassesToMove) {
classToMove.delete();
}
for (PsiElement element: importStatements) {
if (element.isValid()) {
element.delete();
}
@@ -157,7 +163,7 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
private boolean prepareWritable(final UsageInfo[] usages) {
Set<PsiElement> elementsToMakeWritable = new HashSet<PsiElement>();
elementsToMakeWritable.add(myClassToMove);
Collections.addAll(elementsToMakeWritable, myClassesToMove);
elementsToMakeWritable.add(myTargetClass);
for(UsageInfo usage: usages) {
PsiElement element = usage.getElement();
@@ -172,40 +178,44 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
}
private void saveNonCodeUsages(final UsageInfo[] usages) {
for(UsageInfo usageInfo: usages) {
if (usageInfo instanceof NonCodeUsageInfo) {
final NonCodeUsageInfo nonCodeUsage = (NonCodeUsageInfo)usageInfo;
PsiElement element = nonCodeUsage.getElement();
if (element != null && PsiTreeUtil.isAncestor(myClassToMove, element, false)) {
List<NonCodeUsageInfo> list = element.getCopyableUserData(ourNonCodeUsageKey);
if (list == null) {
list = new ArrayList<NonCodeUsageInfo>();
element.putCopyableUserData(ourNonCodeUsageKey, list);
for (PsiClass classToMove : myClassesToMove) {
for(UsageInfo usageInfo: usages) {
if (usageInfo instanceof NonCodeUsageInfo) {
final NonCodeUsageInfo nonCodeUsage = (NonCodeUsageInfo)usageInfo;
PsiElement element = nonCodeUsage.getElement();
if (element != null && PsiTreeUtil.isAncestor(classToMove, element, false)) {
List<NonCodeUsageInfo> list = element.getCopyableUserData(ourNonCodeUsageKey);
if (list == null) {
list = new ArrayList<NonCodeUsageInfo>();
element.putCopyableUserData(ourNonCodeUsageKey, list);
}
list.add(nonCodeUsage);
}
list.add(nonCodeUsage);
}
}
}
}
private void retargetNonCodeUsages(final PsiClass newClass) {
newClass.accept(new PsiRecursiveElementVisitor() {
@Override public void visitElement(final PsiElement element) {
super.visitElement(element);
List<NonCodeUsageInfo> list = element.getCopyableUserData(ourNonCodeUsageKey);
if (list != null) {
for(NonCodeUsageInfo info: list) {
for(int i=0; i<myNonCodeUsages.length; i++) {
if (myNonCodeUsages [i] == info) {
myNonCodeUsages [i] = info.replaceElement(element);
break;
private void retargetNonCodeUsages(final Map<PsiElement, PsiElement> oldToNewElementMap) {
for (PsiElement newClass : oldToNewElementMap.values()) {
newClass.accept(new PsiRecursiveElementVisitor() {
@Override public void visitElement(final PsiElement element) {
super.visitElement(element);
List<NonCodeUsageInfo> list = element.getCopyableUserData(ourNonCodeUsageKey);
if (list != null) {
for(NonCodeUsageInfo info: list) {
for(int i=0; i<myNonCodeUsages.length; i++) {
if (myNonCodeUsages [i] == info) {
myNonCodeUsages [i] = info.replaceElement(element);
break;
}
}
}
element.putCopyableUserData(ourNonCodeUsageKey, null);
}
element.putCopyableUserData(ourNonCodeUsageKey, null);
}
}
});
});
}
}
protected void performPsiSpoilingRefactoring() {
@@ -220,24 +230,29 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
}
}
private static void retargetClassRefs(final PsiClass classToMove, final PsiClass newClass) {
newClass.accept(new JavaRecursiveElementVisitor() {
@Override public void visitReferenceElement(final PsiJavaCodeReferenceElement reference) {
PsiElement element = reference.resolve();
if (element instanceof PsiClass && PsiTreeUtil.isAncestor(classToMove, element, false)) {
PsiClass newInnerClass = findMatchingClass(classToMove, newClass, (PsiClass) element);
try {
reference.bindToElement(newInnerClass);
private static void retargetClassRefsInMoved(final Map<PsiElement, PsiElement> oldToNewElementsMapping) {
for (final PsiElement newClass : oldToNewElementsMapping.values()) {
newClass.accept(new JavaRecursiveElementVisitor() {
@Override public void visitReferenceElement(final PsiJavaCodeReferenceElement reference) {
PsiElement element = reference.resolve();
if (element instanceof PsiClass) {
for (PsiElement oldClass : oldToNewElementsMapping.keySet()) {
if (PsiTreeUtil.isAncestor(oldClass, element, false)) {
PsiClass newInnerClass = findMatchingClass((PsiClass)oldClass, (PsiClass)oldToNewElementsMapping.get(oldClass), (PsiClass)element);
try {
reference.bindToElement(newInnerClass);
return;
}
catch (IncorrectOperationException ex) {
LOG.error(ex);
}
}
}
}
catch(IncorrectOperationException ex) {
LOG.error(ex);
}
}
else {
super.visitReferenceElement(reference);
}
}
});
});
}
}
private static PsiClass findMatchingClass(final PsiClass classToMove, final PsiClass newClass, final PsiClass innerClass) {
@@ -268,7 +283,7 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
protected String getCommandName() {
return RefactoringBundle.message("move.class.to.inner.command.name",
myClassToMove.getQualifiedName(),
myClassesToMove[0].getQualifiedName(),
myTargetClass.getQualifiedName());
}
@@ -283,42 +298,46 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
public MultiMap<PsiElement, String> getConflicts(final UsageInfo[] usages) {
MultiMap<PsiElement, String> conflicts = new MultiMap<PsiElement, String>();
final PsiClass innerClass = myTargetClass.findInnerClassByName(myClassToMove.getName(), false);
if (innerClass != null) {
conflicts.putValue(innerClass, RefactoringBundle.message("move.to.inner.duplicate.inner.class",
CommonRefactoringUtil.htmlEmphasize(myTargetClass.getQualifiedName()),
CommonRefactoringUtil.htmlEmphasize(myClassToMove.getName())));
for (PsiClass classToMove : myClassesToMove) {
final PsiClass innerClass = myTargetClass.findInnerClassByName(classToMove.getName(), false);
if (innerClass != null) {
conflicts.putValue(innerClass, RefactoringBundle.message("move.to.inner.duplicate.inner.class",
CommonRefactoringUtil.htmlEmphasize(myTargetClass.getQualifiedName()),
CommonRefactoringUtil.htmlEmphasize(classToMove.getName())));
}
}
String classToMoveVisibility = VisibilityUtil.getVisibilityModifier(myClassToMove.getModifierList());
String targetClassVisibility = VisibilityUtil.getVisibilityModifier(myTargetClass.getModifierList());
for (int i = 0; i < myClassesToMove.length; i++) {
PsiClass classToMove = myClassesToMove[i];
String classToMoveVisibility = VisibilityUtil.getVisibilityModifier(classToMove.getModifierList());
String targetClassVisibility = VisibilityUtil.getVisibilityModifier(myTargetClass.getModifierList());
boolean moveToOtherPackage = !Comparing.equal(mySourcePackage, myTargetPackage);
if (moveToOtherPackage) {
PsiElement[] elementsToMove = new PsiElement[] { myClassToMove };
myClassToMove.accept(new PackageLocalsUsageCollector(elementsToMove, new PackageWrapper(myTargetPackage), conflicts));
}
boolean moveToOtherPackage = !Comparing.equal(mySourcePackage[i], myTargetPackage);
if (moveToOtherPackage) {
classToMove.accept(new PackageLocalsUsageCollector(myClassesToMove, new PackageWrapper(myTargetPackage), conflicts));
}
ConflictsCollector collector = new ConflictsCollector(conflicts);
if ((moveToOtherPackage &&
(classToMoveVisibility.equals(PsiModifier.PACKAGE_LOCAL) || targetClassVisibility.equals(PsiModifier.PACKAGE_LOCAL))) ||
targetClassVisibility.equals(PsiModifier.PRIVATE)) {
detectInaccessibleClassUsages(usages, collector);
}
if (moveToOtherPackage) {
detectInaccessibleMemberUsages(collector);
ConflictsCollector collector = new ConflictsCollector(classToMove, conflicts);
if ((moveToOtherPackage &&
(classToMoveVisibility.equals(PsiModifier.PACKAGE_LOCAL) || targetClassVisibility.equals(PsiModifier.PACKAGE_LOCAL))) ||
targetClassVisibility.equals(PsiModifier.PRIVATE)) {
detectInaccessibleClassUsages(usages, collector, mySourceVisibility[i]);
}
if (moveToOtherPackage) {
detectInaccessibleMemberUsages(collector);
}
}
return conflicts;
}
private void detectInaccessibleClassUsages(final UsageInfo[] usages, final ConflictsCollector collector) {
private void detectInaccessibleClassUsages(final UsageInfo[] usages, final ConflictsCollector collector, final String visibility) {
for(UsageInfo usage: usages) {
if (usage instanceof MoveRenameUsageInfo && !(usage instanceof NonCodeUsageInfo)) {
PsiElement element = usage.getElement();
if (element == null || PsiTreeUtil.getParentOfType(element, PsiImportStatement.class) != null) continue;
if (isInaccessibleFromTarget(element, mySourceVisibility)) {
collector.addConflict(myClassToMove, element);
if (isInaccessibleFromTarget(element, visibility)) {
collector.addConflict(collector.getClassToMove(), element);
}
}
}
@@ -331,7 +350,7 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
}
private void detectInaccessibleMemberUsages(final ConflictsCollector collector) {
PsiElement[] members = collectPackageLocalMembers();
PsiElement[] members = collectPackageLocalMembers(collector.getClassToMove());
for(PsiElement member: members) {
ReferencesSearch.search(member).forEach(new Processor<PsiReference>() {
public boolean process(final PsiReference psiReference) {
@@ -345,8 +364,8 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
}
}
private PsiElement[] collectPackageLocalMembers() {
return PsiTreeUtil.collectElements(myClassToMove, new PsiElementFilter() {
private static PsiElement[] collectPackageLocalMembers(PsiElement classToMove) {
return PsiTreeUtil.collectElements(classToMove, new PsiElementFilter() {
public boolean isAccepted(final PsiElement element) {
if (element instanceof PsiMember) {
PsiMember member = (PsiMember) element;
@@ -359,11 +378,13 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
});
}
private class ConflictsCollector {
private static class ConflictsCollector {
private final PsiClass myClassToMove;
private final MultiMap<PsiElement, String> myConflicts;
private final Set<PsiElement> myReportedContainers = new HashSet<PsiElement>();
public ConflictsCollector(final MultiMap<PsiElement, String> conflicts) {
public ConflictsCollector(PsiClass classToMove, final MultiMap<PsiElement, String> conflicts) {
myClassToMove = classToMove;
myConflicts = conflicts;
}
@@ -380,5 +401,9 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor {
myConflicts.putValue(targetElement, message);
}
}
public PsiElement getClassToMove() {
return myClassToMove;
}
}
}
@@ -423,17 +423,17 @@ public class MoveClassesOrPackagesDialog extends RefactoringDialog {
private void invokeMoveToInner() {
saveRefactoringSettings();
PsiClass targetClass = findTargetClass();
final PsiClass targetClass = findTargetClass();
final PsiClass[] classesToMove = new PsiClass[myElementsToMove.length];
for (int i = 0; i < myElementsToMove.length; i++) {
PsiClass psiClass = (PsiClass)myElementsToMove[i];
// fire callback after last element has been processed
invokeRefactoring(createMoveToInnerProcessor(targetClass, psiClass, i == myElementsToMove.length - 1 ? myMoveCallback : null));
classesToMove[i] = (PsiClass)myElementsToMove[i];
}
invokeRefactoring(createMoveToInnerProcessor(targetClass, classesToMove, myMoveCallback));
}
//for scala plugin
protected MoveClassToInnerProcessor createMoveToInnerProcessor(PsiClass destination, @NotNull PsiClass psiClass, @Nullable final MoveCallback callback) {
return new MoveClassToInnerProcessor(getProject(), psiClass, destination, isSearchInComments(), isSearchInNonJavaFiles(), callback);
protected MoveClassToInnerProcessor createMoveToInnerProcessor(PsiClass destination, @NotNull PsiClass[] classesToMove, @Nullable final MoveCallback callback) {
return new MoveClassToInnerProcessor(getProject(), classesToMove, destination, isSearchInComments(), isSearchInNonJavaFiles(), callback);
}
protected final boolean isSearchInNonJavaFiles() {
@@ -0,0 +1,17 @@
package pack2;
public class A {
/**
* pack2.A.Class0
*/
public static class Class1 {
Class0 cl0;
}
/**
* pack2.A.Class1
*/
public static class Class0 {
Class1 cl1;
}
}
@@ -0,0 +1,12 @@
package packUser;
import pack2.A;
/**
* pack2.A.Class1
* pack2.A.Class0
*/
public class Class2 {
A.Class1 myClass1;
A.Class0 myClass0;
}
@@ -0,0 +1,10 @@
package pack0;
import pack1.*;
/**
* pack1.Class1
*/
public class Class0 {
Class1 cl1;
}
@@ -0,0 +1,10 @@
package pack1;
import pack0.*;
/**
* pack0.Class0
*/
public class Class1 {
Class0 cl0;
}
@@ -0,0 +1,4 @@
package pack2;
public class A {
}
@@ -0,0 +1,13 @@
package packUser;
import pack1.Class1;
import pack0.Class0;
/**
* pack1.Class1
* pack0.Class0
*/
public class Class2 {
Class1 myClass1;
Class0 myClass0;
}
@@ -35,6 +35,10 @@ public class MoveClassToInnerTest extends CodeInsightTestCase {
doTest(new String[] { "pack1.Class1" }, "pack2.A");
}
public void testSimultaneousMove() throws Exception {
doTest(new String[] { "pack1.Class1", "pack0.Class0" }, "pack2.A");
}
public void testMoveMultiple1() throws Exception {
doTest(new String[] { "pack1.Class1", "pack1.Class2" }, "pack2.A");
}
@@ -112,7 +116,7 @@ public class MoveClassToInnerTest extends CodeInsightTestCase {
prepareTest();
PsiClass classToMove = myJavaFacade.findClass(className, ProjectScope.getAllScope(myProject));
PsiClass targetClass = myJavaFacade.findClass(targetClassName, ProjectScope.getAllScope(myProject));
MoveClassToInnerProcessor processor = new MoveClassToInnerProcessor(myProject, classToMove, targetClass, true, true, null);
MoveClassToInnerProcessor processor = new MoveClassToInnerProcessor(myProject, new PsiClass[]{classToMove}, targetClass, true, true, null);
UsageInfo[] usages = processor.findUsages();
MultiMap<PsiElement,String> conflicts = processor.getConflicts(usages);
assertSameElements(conflicts.values() , expectedConflicts);
@@ -129,9 +133,7 @@ public class MoveClassToInnerTest extends CodeInsightTestCase {
PsiClass targetClass = myJavaFacade.findClass(targetClassName, ProjectScope.getAllScope(myProject));
assertNotNull(targetClass);
for(PsiClass psiClass: classes) {
new MoveClassToInnerProcessor(myProject, psiClass, targetClass, true, true, null).run();
}
new MoveClassToInnerProcessor(myProject, classes, targetClass, true, true, null).run();
PsiDocumentManager.getInstance(myProject).commitAllDocuments();
FileDocumentManager.getInstance().saveAllDocuments();
}
@@ -30,7 +30,7 @@ public class LanguageLevelUtil {
}
@NotNull
public static LanguageLevel getEffectiveLanguageLevel(final Module module) {
public static LanguageLevel getEffectiveLanguageLevel(@NotNull final Module module) {
ApplicationManager.getApplication().assertReadAccessAllowed();
LanguageLevel level = LanguageLevelModuleExtension.getInstance(module).getLanguageLevel();
if (level != null) return level;
@@ -119,13 +119,11 @@ public class TemplateSegments {
}
public int getSegmentWithTheSameStart(int segmentNumber, int start) {
for (int i = 0; i < mySegments.size(); i++) {
if (i != segmentNumber) {
final RangeMarker segment = mySegments.get(i);
final int startOffset2 = segment.getStartOffset();
if (start == startOffset2) {
return i;
}
for (int i = segmentNumber + 1; i < mySegments.size(); i++) {
final RangeMarker segment = mySegments.get(i);
final int startOffset2 = segment.getStartOffset();
if (start == startOffset2) {
return i;
}
}
@@ -242,8 +242,8 @@ module.source.roots.not.configured.title=No Source Roots Configured
module.cannot.load.error=Cannot load module file ''{0}'':\n{1}
module.corrupted.file.error=Invalid or corrupted module file ''{0}'':\n{1}
module.corrupted.data.error=Corrupted module data at: {0}
module.unknown.type.single.error=Cannot determine module type for the following module:\n\"{0}\"\nThe module will be treated as a Java module.
module.unknown.type.multiple.error=Cannot determine module type for the following modules:\n{0}\nAll mentioned modules will be treated as JAVA modules.
module.unknown.type.single.error=Cannot determine module type for the following module:\n\"{0}\"\nThe module will be treated as a Unknown module.
module.unknown.type.multiple.error=Cannot determine module type for the following modules:\n{0}\nAll mentioned modules will be treated as Unknown modules.
module.unknown.type.title=Unknown Module Type
module.remove.from.project.confirmation=Would you like to remove module ''{0}'' from the project?
element.kind.name.module=module
@@ -538,3 +538,4 @@ vcs.quicklist.pupup.section.local.history=Local History
options.background.processes.title=Background processes
options.background.processes.enable=Enable background processes
options.check.changed.on.server.title="Changed on server" conflicts
revision.changes.not.supported=Current VCS does not support viewing changes by revision
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2010 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.
@@ -29,11 +29,13 @@ import com.intellij.openapi.vcs.changes.VcsAppendableDirtyScope;
import com.intellij.openapi.vcs.checkin.CheckinEnvironment;
import com.intellij.openapi.vcs.diff.DiffProvider;
import com.intellij.openapi.vcs.diff.RevisionSelector;
import com.intellij.openapi.vcs.history.VcsFileRevision;
import com.intellij.openapi.vcs.history.VcsHistoryProvider;
import com.intellij.openapi.vcs.history.VcsRevisionNumber;
import com.intellij.openapi.vcs.merge.MergeProvider;
import com.intellij.openapi.vcs.rollback.RollbackEnvironment;
import com.intellij.openapi.vcs.update.UpdateEnvironment;
import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.Convertor;
import org.jetbrains.annotations.NonNls;
@@ -466,5 +468,20 @@ public abstract class AbstractVcs extends StartedActivated {
public boolean isVcsBackgroundOperationsAllowed(final VirtualFile root) {
return true;
}
/**
* Returns all files for a revision where
*
* @param revision revision
* @param file one of files from revision
* @return committed change list from where you can get all committed files
* @throws VcsException if VCS does not support such operation
*
* @since 9.0.2
*/
@Nullable
public CommittedChangeList getRevisionChanges(final VcsFileRevision revision, final VirtualFile file) throws VcsException {
throw new RevisionChangesNotSupportedException();
}
}
@@ -13,17 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.spellchecker.tokenizer;
import com.intellij.lang.properties.psi.impl.PropertyValueImpl;
import org.jetbrains.annotations.NotNull;
package com.intellij.openapi.vcs;
/**
* @author Konstantin Bulenkov
*/
public class PropertyValueTokenizer extends Tokenizer<PropertyValueImpl> {
@Override
public Token[] tokenize(@NotNull PropertyValueImpl element) {
return new Token[]{new Token<PropertyValueImpl>(element, element.getText(),false)};
public class RevisionChangesNotSupportedException extends VcsException {
public RevisionChangesNotSupportedException() {
super(VcsBundle.message("revision.changes.not.supported"));
}
}
@@ -31,7 +31,9 @@ import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.Function;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.EclipseJDOMUtil;
@@ -78,7 +80,11 @@ public class ExportEclipseProjectsAction extends AnAction implements DumbAware {
//todo suggest smth with hierarchy modules
if (!incompatibleModules.isEmpty()) {
if (Messages.showOkCancelDialog(project, "Eclipse incompatible modules found. Would you like to proceed and possibly lose your configurations?", "Eclipse Incompatible Modules Found", Messages.getWarningIcon()) != DialogWrapper.OK_EXIT_CODE) {
if (Messages.showOkCancelDialog(project, "<html><body>Eclipse incompatible modules found:<ul><br><li>" + StringUtil.join(incompatibleModules, new Function<Module, String>() {
public String fun(Module module) {
return module.getName();
}
}, "<br><li>") + "</ul><br>Would you like to proceed and possibly lose your configurations?</body></html>", "Eclipse Incompatible Modules Found", Messages.getWarningIcon()) != DialogWrapper.OK_EXIT_CODE) {
return;
}
} else if (modules.isEmpty()){
+11 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2010 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.
@@ -31,11 +31,13 @@ import com.intellij.openapi.vcs.changes.CommitExecutor;
import com.intellij.openapi.vcs.checkin.CheckinEnvironment;
import com.intellij.openapi.vcs.diff.DiffProvider;
import com.intellij.openapi.vcs.diff.RevisionSelector;
import com.intellij.openapi.vcs.history.VcsFileRevision;
import com.intellij.openapi.vcs.history.VcsHistoryProvider;
import com.intellij.openapi.vcs.history.VcsRevisionNumber;
import com.intellij.openapi.vcs.merge.MergeProvider;
import com.intellij.openapi.vcs.rollback.RollbackEnvironment;
import com.intellij.openapi.vcs.update.UpdateEnvironment;
import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.EventDispatcher;
@@ -43,6 +45,7 @@ import com.intellij.util.containers.ComparatorDelegate;
import com.intellij.util.containers.Convertor;
import git4idea.annotate.GitAnnotationProvider;
import git4idea.changes.GitChangeProvider;
import git4idea.changes.GitChangeUtils;
import git4idea.changes.GitCommittedChangeListProvider;
import git4idea.changes.GitOutgoingChangesProvider;
import git4idea.checkin.GitCheckinEnvironment;
@@ -690,4 +693,11 @@ public class GitVcs extends AbstractVcs {
public List<CommitExecutor> getCommitExecutors() {
return Collections.<CommitExecutor>singletonList(myCommitAndPushExecutor);
}
@Override
public CommittedChangeList getRevisionChanges(final VcsFileRevision revision, final VirtualFile file) throws VcsException {
final Project project = getProject();
final VirtualFile vcsRoot = GitUtil.getGitRoot(file);
return GitChangeUtils.getRevisionChanges(project, vcsRoot, revision.getRevisionNumber().asString());
}
}
+37 -37
View File
@@ -26,43 +26,43 @@
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://C:/maven/maven-2.2/components/maven-plugin-descriptor/target/generated-sources/modello" />
<root url="file://C:/maven/maven-2.2/components/maven-toolchain/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/maven-profile/target/generated-sources/modello" />
<root url="file://C:/maven/maven-2.2/components/maven-script/maven-script-ant/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-project/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-script/maven-script-beanshell/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-settings/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-compat/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-artifact-manager/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/maven-model/target/generated-sources/modello" />
<root url="file://C:/maven/maven-2.2/components/maven-settings/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/maven-plugin-parameter-documenter/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/maven-artifact-manager/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-profile/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-plugin-parameter-documenter/target/generated-sources/modello" />
<root url="file://C:/maven/maven-2.2/components/maven-reporting/maven-reporting-api/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-artifact/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-core/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-core/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/apache-maven/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/maven-plugin-api/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-artifact-test/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-toolchain/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-monitor/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-model/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/maven-plugin-descriptor/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/maven-toolchain/target/generated-sources/modello" />
<root url="file://C:/maven/maven-2.2/components/maven-settings/target/generated-sources/modello" />
<root url="file://C:/maven/maven-2.2/components/maven-plugin-registry/target/generated-sources/modello" />
<root url="file://C:/maven/maven-2.2/components/maven-plugin-registry/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-core-it-runner/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/maven-project/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/maven-artifact/src/test/java" />
<root url="file://C:/maven/maven-2.2/components/maven-plugin-descriptor/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-repository-metadata/target/generated-sources/modello" />
<root url="file://C:/maven/maven-2.2/components/maven-error-diagnostics/src/main/java" />
<root url="file://C:/maven/maven-2.2/components/maven-script/maven-script-ant/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-artifact-test/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-plugin-parameter-documenter/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-reporting/maven-reporting-api/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-script/maven-script-ant/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-model/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-core/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-plugin-registry/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-model/target/generated-sources/modello" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-plugin-api/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-repository-metadata/target/generated-sources/modello" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-plugin-descriptor/target/generated-sources/modello" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-plugin-parameter-documenter/target/generated-sources/modello" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-project/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-toolchain/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-script/maven-script-ant/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-artifact/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-profile/target/generated-sources/modello" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-project/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-profile/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-monitor/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-plugin-registry/target/generated-sources/modello" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-core/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-settings/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/apache-maven/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-settings/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-artifact/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-toolchain/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-toolchain/target/generated-sources/modello" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-settings/target/generated-sources/modello" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-plugin-descriptor/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-core-it-runner/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-script/maven-script-beanshell/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-plugin-descriptor/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-artifact-manager/src/test/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-compat/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-artifact-manager/src/main/java" />
<root url="file://$MODULE_DIR$/../../../../maven/maven-2.2/components/maven-error-diagnostics/src/main/java" />
</SOURCES>
</library>
</orderEntry>
@@ -16,12 +16,12 @@
package org.jetbrains.idea.maven.dom;
import com.intellij.javaee.ExternalResourceManager;
import com.intellij.javaee.ExternalResourceManagerEx;
import com.intellij.javaee.ResourceRegistrar;
import com.intellij.javaee.StandardResourceProvider;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.maven.utils.MavenLog;
public class MavenSchemaProvider implements StandardResourceProvider {
public static final String MAVEN_PROJECT_SCHEMA_URL = "http://maven.apache.org/xsd/maven-4.0.0.xsd";
@@ -38,11 +38,12 @@ public class MavenSchemaProvider implements StandardResourceProvider {
@NotNull
public static VirtualFile getSchemaFile(@NotNull String url) {
String location = ExternalResourceManager.getInstance().getResourceLocation(url);
String location = ((ExternalResourceManagerEx)ExternalResourceManager.getInstance()).getStdResource(url, null);
assert location != null : "cannot find a standard resource for " + url;
VirtualFile result = VfsUtil.findRelativeFile(location, null);
if (result == null) {
MavenLog.LOG.error("Cannot find a schema file for URL: " + url + " location: " + location);
}
assert result != null : "cannot find a schema file for URL: " + url + " location: " + location;
return result;
}
}
@@ -8,9 +8,9 @@ import org.jetbrains.idea.maven.utils.MavenJDOMUtil;
import java.util.List;
import java.util.Map;
public class GroovyImporter extends MavenImporter {
public GroovyImporter() {
super("org.codehaus.groovy.maven", "gmaven-plugin");
public abstract class GroovyImporter extends MavenImporter {
public GroovyImporter(String pluginGroupID, String pluginArtifactID) {
super(pluginGroupID, pluginArtifactID);
}
public boolean isApplicable(MavenProject project) {
@@ -0,0 +1,30 @@
/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.idea.maven.importing;
import com.intellij.openapi.module.Module;
import org.jdom.Element;
import org.jetbrains.idea.maven.project.*;
import org.jetbrains.idea.maven.utils.MavenJDOMUtil;
import java.util.List;
import java.util.Map;
public class Groovy_1_0_Importer extends GroovyImporter {
public Groovy_1_0_Importer() {
super("org.codehaus.groovy.maven", "gmaven-plugin");
}
}
@@ -0,0 +1,30 @@
/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.idea.maven.importing;
import com.intellij.openapi.module.Module;
import org.jdom.Element;
import org.jetbrains.idea.maven.project.*;
import org.jetbrains.idea.maven.utils.MavenJDOMUtil;
import java.util.List;
import java.util.Map;
public class Groovy_1_1_plus_Importer extends GroovyImporter {
public Groovy_1_1_plus_Importer() {
super("org.codehaus.gmaven", "gmaven-plugin");
}
}
@@ -53,7 +53,7 @@ public class TransferListenerAdapter implements TransferListener {
}
protected void doUpdateProgress(long downloaded, long total) {
myIndicator.setText2(ProjectBundle.message("maven.transfer.progress", downloaded, total, myRepository, myResource));
myIndicator.setText2(ProjectBundle.message("maven.transfer.progress", downloaded, total == 0 ? "?" : total, myRepository, myResource));
}
public void transferProgress(TransferEvent event, byte[] bytes, int i) {
@@ -1,6 +1,7 @@
<!DOCTYPE idea-plugin PUBLIC "Plugin/DTD" "http://plugins.intellij.net/plugin.dtd">
<idea-plugin url="http://www.jetbrains.com/idea">
<extensions xmlns="org.jetbrains.idea.maven">
<importer implementation="org.jetbrains.idea.maven.importing.GroovyImporter"/>
<importer implementation="org.jetbrains.idea.maven.importing.Groovy_1_0_Importer"/>
<importer implementation="org.jetbrains.idea.maven.importing.Groovy_1_1_plus_Importer"/>
</extensions>
</idea-plugin>
@@ -416,4 +416,49 @@ public class GroovyImporterTest extends MavenImportingTestCase {
assertExcludes("project",
"target/generated-sources/groovy-stubs");
}
}
public void testDoNotAddGroovySpecificGeneratedSourcesForGMaven_1_2() throws Exception {
createStdProjectFolders();
createProjectSubDirs("target/generated-sources/xxx/yyy",
"target/generated-sources/groovy-stubs/main/foo",
"target/generated-sources/groovy-stubs/test/bar");
importProject("<groupId>test</groupId>" +
"<artifactId>project</artifactId>" +
"<version>1</version>" +
"<build>" +
" <plugins>" +
" <plugin>" +
" <groupId>org.codehaus.gmaven</groupId>" +
" <artifactId>gmaven-plugin</artifactId>" +
" <version>1.2</version>" +
" <executions>" +
" <execution>" +
" <goals>" +
" <goal>generateStubs</goal>" +
" <goal>compile</goal>" +
" <goal>generateTestStubs</goal>" +
" <goal>testCompile</goal>" +
" </goals>" +
" </execution>" +
" </executions>" +
" </plugin>" +
" </plugins>" +
"</build>");
assertModules("project");
assertSources("project",
"src/main/java",
"src/main/resources",
"target/generated-sources/xxx");
assertTestSources("project",
"src/test/java",
"src/test/resources");
assertExcludes("project",
"target/generated-sources/groovy-stubs");
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
* Copyright 2000-2010 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.
@@ -43,12 +43,14 @@ import com.intellij.openapi.vcs.annotate.AnnotationProvider;
import com.intellij.openapi.vcs.changes.*;
import com.intellij.openapi.vcs.checkin.CheckinEnvironment;
import com.intellij.openapi.vcs.diff.DiffProvider;
import com.intellij.openapi.vcs.history.VcsFileRevision;
import com.intellij.openapi.vcs.history.VcsHistoryProvider;
import com.intellij.openapi.vcs.history.VcsRevisionNumber;
import com.intellij.openapi.vcs.merge.MergeProvider;
import com.intellij.openapi.vcs.rollback.RollbackEnvironment;
import com.intellij.openapi.vcs.update.UpdateEnvironment;
import com.intellij.openapi.vcs.versionBrowser.ChangeBrowserSettings;
import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.ThreeState;
@@ -60,16 +62,14 @@ import com.intellij.util.messages.Topic;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.actions.ShowAllSubmittedFilesAction;
import org.jetbrains.idea.svn.actions.ShowPropertiesDiffWithLocalAction;
import org.jetbrains.idea.svn.actions.SvnMergeProvider;
import org.jetbrains.idea.svn.annotate.SvnAnnotationProvider;
import org.jetbrains.idea.svn.checkin.SvnCheckinEnvironment;
import org.jetbrains.idea.svn.dialogs.SvnFormatWorker;
import org.jetbrains.idea.svn.dialogs.WCInfo;
import org.jetbrains.idea.svn.history.LoadedRevisionsCache;
import org.jetbrains.idea.svn.history.SvnChangeList;
import org.jetbrains.idea.svn.history.SvnCommittedChangesProvider;
import org.jetbrains.idea.svn.history.SvnHistoryProvider;
import org.jetbrains.idea.svn.history.*;
import org.jetbrains.idea.svn.rollback.SvnRollbackEnvironment;
import org.jetbrains.idea.svn.update.SvnIntegrateEnvironment;
import org.jetbrains.idea.svn.update.SvnUpdateEnvironment;
@@ -963,4 +963,9 @@ public class SvnVcs extends AbstractVcs {
public boolean isVcsBackgroundOperationsAllowed(VirtualFile root) {
return ThreeState.YES.equals(myAuthNotifier.isAuthenticatedFor(root));
}
@Override
public CommittedChangeList getRevisionChanges(VcsFileRevision revision, VirtualFile file) throws VcsException {
return ShowAllSubmittedFilesAction.loadRevisions(getProject(), (SvnFileRevision)revision, file);
}
}
@@ -51,4 +51,6 @@ public abstract class ExternalResourceManagerEx extends ExternalResourceManager
@Nullable
public abstract String getUserResourse(Project project, String url, String version);
@Nullable
public abstract String getStdResource(String url, String version);
}
@@ -131,17 +131,12 @@ public class ExternalResourceManagerImpl extends ExternalResourceManagerEx imple
public String getResourceLocation(@NonNls String url, String version) {
String result = getUserResourse(url, version);
Map<String, String> map;
if (result == null) {
map = getMap(myStdResources.getValue(), version, false);
result = map != null ? map.get(url) : null;
result = getStdResource(url, version);
}
if (result == null) {
result = url;
}
return result;
}
@@ -152,6 +147,13 @@ public class ExternalResourceManagerImpl extends ExternalResourceManagerEx imple
return resourse == null ? getUserResourse(url, version) : resourse;
}
@Override
@Nullable
public String getStdResource(String url, String version) {
Map<String, String> map = getMap(myStdResources.getValue(), version, false);
return map != null ? map.get(url) : null;
}
@Nullable
private String getUserResourse(String url, String version) {
Map<String, String> map = getMap(myResources, version, false);