diff --git a/bin/nix/idea.sh b/bin/nix/idea.sh index 8396571dac78..f81b8298b51b 100644 --- a/bin/nix/idea.sh +++ b/bin/nix/idea.sh @@ -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 diff --git a/java/idea-ui/src/com/intellij/ide/actions/OpenProjectAction.java b/java/idea-ui/src/com/intellij/ide/actions/OpenProjectAction.java index e4e02421c2e9..4b8d1ce8e1cd 100644 --- a/java/idea-ui/src/com/intellij/ide/actions/OpenProjectAction.java +++ b/java/idea-ui/src/com/intellij/ide/actions/OpenProjectAction.java @@ -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 extensions = new HashSet(); + 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, ", "))); diff --git a/java/java-impl/src/com/intellij/codeInspection/java15api/Java15APIUsageInspection.java b/java/java-impl/src/com/intellij/codeInspection/java15api/Java15APIUsageInspection.java index 6d0e3397f0c4..6a2da5caec6a 100644 --- a/java/java-impl/src/com/intellij/codeInspection/java15api/Java15APIUsageInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/java15api/Java15APIUsageInspection.java @@ -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); + } } } } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java index 0f2de7af7561..4bc51108528b 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantDialog.java @@ -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; } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java index e2a6f8c20ad4..7ab8824f8e6b 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java @@ -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 usages = new ArrayList(); - String newName = myTargetClass.getQualifiedName() + "." + myClassToMove.getName(); - Collections.addAll(usages, MoveClassesOrPackagesUtil.findUsages(myClassToMove, mySearchInComments, - mySearchInNonJavaFiles, newName)); - for (Iterator iterator = usages.iterator(); iterator.hasNext();) { - UsageInfo usageInfo = iterator.next(); - if (!(usageInfo instanceof NonCodeUsageInfo) && PsiTreeUtil.isAncestor(myClassToMove, usageInfo.getElement(), false)) { - iterator.remove(); - } + final List usages = new ArrayList(); + 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 importStatements = new ArrayList(); + if (!CodeStyleSettingsManager.getSettings(myProject).INSERT_INNER_CLASS_IMPORTS) { + usages = filterUsagesInImportStatements(usages, importStatements); + } + saveNonCodeUsages(usages); + final Map oldToNewElementsMapping = new HashMap(); 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 importStatements = new ArrayList(); - 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 oldToNewElementsMapping = new HashMap(); - 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 elementsToMakeWritable = new HashSet(); - 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 list = element.getCopyableUserData(ourNonCodeUsageKey); - if (list == null) { - list = new ArrayList(); - 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 list = element.getCopyableUserData(ourNonCodeUsageKey); + if (list == null) { + list = new ArrayList(); + 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 list = element.getCopyableUserData(ourNonCodeUsageKey); - if (list != null) { - for(NonCodeUsageInfo info: list) { - for(int i=0; i oldToNewElementMap) { + for (PsiElement newClass : oldToNewElementMap.values()) { + newClass.accept(new PsiRecursiveElementVisitor() { + @Override public void visitElement(final PsiElement element) { + super.visitElement(element); + List list = element.getCopyableUserData(ourNonCodeUsageKey); + if (list != null) { + for(NonCodeUsageInfo info: list) { + for(int i=0; i 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 getConflicts(final UsageInfo[] usages) { MultiMap conflicts = new MultiMap(); - 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() { 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 myConflicts; private final Set myReportedContainers = new HashSet(); - public ConflictsCollector(final MultiMap conflicts) { + public ConflictsCollector(PsiClass classToMove, final MultiMap conflicts) { + myClassToMove = classToMove; myConflicts = conflicts; } @@ -380,5 +401,9 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor { myConflicts.putValue(targetElement, message); } } + + public PsiElement getClassToMove() { + return myClassToMove; + } } } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java index 3e6a1fb8acb4..2c85428200b6 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java @@ -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() { diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/pack0/empty.txt b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/pack0/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/pack1/empty.txt b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/pack1/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/pack2/A.java b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/pack2/A.java new file mode 100644 index 000000000000..bb3f1f9913dd --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/pack2/A.java @@ -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; + } +} diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/pack2/empty.txt b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/pack2/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/packUser/Class2.java b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/packUser/Class2.java new file mode 100644 index 000000000000..b29e5c63a866 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/after/packUser/Class2.java @@ -0,0 +1,12 @@ +package packUser; + +import pack2.A; + +/** + * pack2.A.Class1 + * pack2.A.Class0 + */ +public class Class2 { + A.Class1 myClass1; + A.Class0 myClass0; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack0/Class0.java b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack0/Class0.java new file mode 100644 index 000000000000..2a4bd48e0965 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack0/Class0.java @@ -0,0 +1,10 @@ +package pack0; + +import pack1.*; + +/** + * pack1.Class1 + */ +public class Class0 { + Class1 cl1; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack0/empty.txt b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack0/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack1/Class1.java b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack1/Class1.java new file mode 100644 index 000000000000..f655559f34f8 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack1/Class1.java @@ -0,0 +1,10 @@ +package pack1; + +import pack0.*; + +/** + * pack0.Class0 + */ +public class Class1 { + Class0 cl0; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack1/empty.txt b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack1/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack2/A.java b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack2/A.java new file mode 100644 index 000000000000..e1886e55ac9c --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack2/A.java @@ -0,0 +1,4 @@ +package pack2; + +public class A { +} diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack2/empty.txt b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/pack2/empty.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/packUser/Class2.java b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/packUser/Class2.java new file mode 100644 index 000000000000..36f76c298c7e --- /dev/null +++ b/java/java-tests/testData/refactoring/moveClassToInner/simultaneousMove/before/packUser/Class2.java @@ -0,0 +1,13 @@ +package packUser; + +import pack1.Class1; +import pack0.Class0; + +/** + * pack1.Class1 + * pack0.Class0 + */ +public class Class2 { + Class1 myClass1; + Class0 myClass0; +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveClassToInnerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveClassToInnerTest.java index 55042d916590..e4dc438ee2a7 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MoveClassToInnerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveClassToInnerTest.java @@ -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 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(); } diff --git a/java/openapi/src/com/intellij/openapi/module/LanguageLevelUtil.java b/java/openapi/src/com/intellij/openapi/module/LanguageLevelUtil.java index 771b75e2851a..2b52e0c05863 100644 --- a/java/openapi/src/com/intellij/openapi/module/LanguageLevelUtil.java +++ b/java/openapi/src/com/intellij/openapi/module/LanguageLevelUtil.java @@ -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; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSegments.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSegments.java index b7fc0b7deef5..7def1d7b6894 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSegments.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateSegments.java @@ -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; } } diff --git a/platform/platform-resources-en/src/messages/ProjectBundle.properties b/platform/platform-resources-en/src/messages/ProjectBundle.properties index 6e9ff3b2187d..0fdd01a1992b 100644 --- a/platform/platform-resources-en/src/messages/ProjectBundle.properties +++ b/platform/platform-resources-en/src/messages/ProjectBundle.properties @@ -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 diff --git a/platform/platform-resources-en/src/messages/VcsBundle.properties b/platform/platform-resources-en/src/messages/VcsBundle.properties index 688f95e45bf6..a50133f1b099 100644 --- a/platform/platform-resources-en/src/messages/VcsBundle.properties +++ b/platform/platform-resources-en/src/messages/VcsBundle.properties @@ -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 diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/AbstractVcs.java b/platform/vcs-api/src/com/intellij/openapi/vcs/AbstractVcs.java index 765d1a6166c9..5e67604cc58f 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/AbstractVcs.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/AbstractVcs.java @@ -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(); + } } diff --git a/plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/PropertyValueTokenizer.java b/platform/vcs-api/src/com/intellij/openapi/vcs/RevisionChangesNotSupportedException.java similarity index 62% rename from plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/PropertyValueTokenizer.java rename to platform/vcs-api/src/com/intellij/openapi/vcs/RevisionChangesNotSupportedException.java index e8eba9961e60..55a33570d2d3 100644 --- a/plugins/spellchecker/src/com/intellij/spellchecker/tokenizer/PropertyValueTokenizer.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/RevisionChangesNotSupportedException.java @@ -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 { - @Override - public Token[] tokenize(@NotNull PropertyValueImpl element) { - return new Token[]{new Token(element, element.getText(),false)}; +public class RevisionChangesNotSupportedException extends VcsException { + public RevisionChangesNotSupportedException() { + super(VcsBundle.message("revision.changes.not.supported")); } } diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/export/ExportEclipseProjectsAction.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/export/ExportEclipseProjectsAction.java index 80dcbe258c82..f8a32937e0d8 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/export/ExportEclipseProjectsAction.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/export/ExportEclipseProjectsAction.java @@ -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, "Eclipse incompatible modules found:

  • " + StringUtil.join(incompatibleModules, new Function() { + public String fun(Module module) { + return module.getName(); + } + }, "
  • ") + "

Would you like to proceed and possibly lose your configurations?", "Eclipse Incompatible Modules Found", Messages.getWarningIcon()) != DialogWrapper.OK_EXIT_CODE) { return; } } else if (modules.isEmpty()){ diff --git a/plugins/git4idea/src/git4idea/GitVcs.java b/plugins/git4idea/src/git4idea/GitVcs.java index 0b42f5453877..5e0f55d7dde2 100644 --- a/plugins/git4idea/src/git4idea/GitVcs.java +++ b/plugins/git4idea/src/git4idea/GitVcs.java @@ -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 getCommitExecutors() { return Collections.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()); + } } diff --git a/plugins/maven/maven.iml b/plugins/maven/maven.iml index eb40b57bc542..d82b2612467b 100644 --- a/plugins/maven/maven.iml +++ b/plugins/maven/maven.iml @@ -26,43 +26,43 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenSchemaProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenSchemaProvider.java index ae4d91a80d27..360c6a53c60d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenSchemaProvider.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/MavenSchemaProvider.java @@ -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; } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/GroovyImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/GroovyImporter.java index b8ac70a249a9..a3ea43e544e5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/GroovyImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/GroovyImporter.java @@ -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) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/Groovy_1_0_Importer.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/Groovy_1_0_Importer.java new file mode 100644 index 000000000000..f72955faed18 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/Groovy_1_0_Importer.java @@ -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"); + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/Groovy_1_1_plus_Importer.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/Groovy_1_1_plus_Importer.java new file mode 100644 index 000000000000..47968b3a215e --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/Groovy_1_1_plus_Importer.java @@ -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"); + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/TransferListenerAdapter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/TransferListenerAdapter.java index d47b1c336ae8..12008224ecca 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/TransferListenerAdapter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/TransferListenerAdapter.java @@ -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) { diff --git a/plugins/maven/src/main/resources/META-INF/groovy-support.xml b/plugins/maven/src/main/resources/META-INF/groovy-support.xml index 3c91b4f5433e..764219a64b21 100644 --- a/plugins/maven/src/main/resources/META-INF/groovy-support.xml +++ b/plugins/maven/src/main/resources/META-INF/groovy-support.xml @@ -1,6 +1,7 @@ - + + \ No newline at end of file diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java index 450aa150ff63..cdd4f139b3c7 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java @@ -416,4 +416,49 @@ public class GroovyImporterTest extends MavenImportingTestCase { assertExcludes("project", "target/generated-sources/groovy-stubs"); } -} \ No newline at end of file + + 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("test" + + "project" + + "1" + + + "" + + " " + + " " + + " org.codehaus.gmaven" + + " gmaven-plugin" + + " 1.2" + + " " + + " " + + " " + + " generateStubs" + + " compile" + + " generateTestStubs" + + " testCompile" + + " " + + " " + + " " + + " " + + " " + + ""); + + 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"); + } + +} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java index 46a7ded54ae2..8c39bee64784 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnVcs.java @@ -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); + } } diff --git a/xml/impl/src/com/intellij/javaee/ExternalResourceManagerEx.java b/xml/impl/src/com/intellij/javaee/ExternalResourceManagerEx.java index af830a65cc73..5d8c7ce5e413 100644 --- a/xml/impl/src/com/intellij/javaee/ExternalResourceManagerEx.java +++ b/xml/impl/src/com/intellij/javaee/ExternalResourceManagerEx.java @@ -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); } diff --git a/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java b/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java index 65e6ab8b2de9..e0a3757eb498 100644 --- a/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java +++ b/xml/impl/src/com/intellij/javaee/ExternalResourceManagerImpl.java @@ -131,17 +131,12 @@ public class ExternalResourceManagerImpl extends ExternalResourceManagerEx imple public String getResourceLocation(@NonNls String url, String version) { String result = getUserResourse(url, version); - Map 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 map = getMap(myStdResources.getValue(), version, false); + return map != null ? map.get(url) : null; + } + @Nullable private String getUserResourse(String url, String version) { Map map = getMap(myResources, version, false);