diff options
author | Jean-Baptiste Queru <jbq@google.com> | 2013-04-01 14:41:51 -0700 |
---|---|---|
committer | Jean-Baptiste Queru <jbq@google.com> | 2013-04-01 14:41:51 -0700 |
commit | 2bd2b7c2623d4266384e890271869efc044aabff (patch) | |
tree | 0b31f50e55975b6354ed458314e17b4441bb4e17 /java/java-psi-impl/src/com/intellij/codeInsight | |
parent | 1d526b16d476792ca7ce47616d55833115e8d6ab (diff) | |
download | idea-2bd2b7c2623d4266384e890271869efc044aabff.tar.gz |
Snapshot ee98b298267d0e09d2cd2f0731b6480a56dd48e7 from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: I4515f72af131fdea9fc6905a4dc0fe9532409a81
Diffstat (limited to 'java/java-psi-impl/src/com/intellij/codeInsight')
3 files changed, 47 insertions, 43 deletions
diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java b/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java index 4d96915af333..4b244364416f 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java @@ -298,28 +298,9 @@ public abstract class BaseExternalAnnotationsManager extends ExternalAnnotations MostlySingularMultiMap<String, AnnotationData> fileData = getDataFromFile(file); - Collection<AnnotationData> data = (Collection<AnnotationData>)fileData.get(externalName); - for (AnnotationData ad : data) { - if (result.contains(ad)) { - // there can be compatible annotations in different files - if (Comparing.equal(ad.virtualFile, file.getVirtualFile())) { - LOG.error("Duplicate signature:\n" + externalName + "; in " + file); - } - } - else { - result.add(ad); - } - } + addAnnotations(result, externalName, file, fileData); if (oldExternalName != null && !externalName.equals(oldExternalName)) { - Collection<AnnotationData> oldCollection = (Collection<AnnotationData>)fileData.get(oldExternalName); - for (AnnotationData ad : oldCollection) { - if (result.contains(ad)) { - LOG.error("Duplicate signature o:\n" + oldExternalName + "; in " + toVirtualFiles(files)); - } - else { - result.add(ad); - } - } + addAnnotations(result, oldExternalName, file, fileData); } } if (result.isEmpty()) { @@ -329,13 +310,22 @@ public abstract class BaseExternalAnnotationsManager extends ExternalAnnotations return result; } - static List<VirtualFile> toVirtualFiles(List<PsiFile> files) { - return ContainerUtil.map(files, new Function<PsiFile, VirtualFile>() { - @Override - public VirtualFile fun(PsiFile file) { - return file.getVirtualFile(); + private static void addAnnotations(@NotNull List<AnnotationData> result, + @NotNull String externalName, + @NotNull PsiFile file, + @NotNull MostlySingularMultiMap<String, AnnotationData> fileData) { + Iterable<AnnotationData> data = fileData.get(externalName); + for (AnnotationData ad : data) { + if (result.contains(ad)) { + // there can be compatible annotations in different files + if (Comparing.equal(ad.virtualFile, file.getVirtualFile())) { + LOG.error("Duplicate signature: '" + externalName + "'; in " + file.getVirtualFile()); + } } - }); + else { + result.add(ad); + } + } } @Override diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java index f78ee83b570a..1aa0ac222946 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 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. @@ -25,6 +25,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.NullableFunction; +import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; @@ -421,21 +422,20 @@ public class ExceptionUtil { } @NotNull - public static List<PsiClassType> getUnhandledExceptions(final PsiThrowStatement throwStatement, @Nullable final PsiElement topElement) { - final PsiExpression exception = throwStatement.getException(); - final List<PsiType> types = getPreciseThrowTypes(exception); - return ContainerUtil.mapNotNull(types, new NullableFunction<PsiType, PsiClassType>() { - @Override - public PsiClassType fun(PsiType type) { - if (type instanceof PsiClassType) { - final PsiClassType classType = (PsiClassType)type; + public static List<PsiClassType> getUnhandledExceptions(PsiThrowStatement throwStatement, @Nullable PsiElement topElement) { + List<PsiClassType> unhandled = new SmartList<PsiClassType>(); + for (PsiType type : getPreciseThrowTypes(throwStatement.getException())) { + List<PsiType> types = type instanceof PsiDisjunctionType ? ((PsiDisjunctionType)type).getDisjunctions() : Collections.singletonList(type); + for (PsiType subType : types) { + if (subType instanceof PsiClassType) { + PsiClassType classType = (PsiClassType)subType; if (!isUncheckedException(classType) && !isHandled(throwStatement, classType, topElement)) { - return classType; + unhandled.add(classType); } } - return null; } - }); + } + return unhandled; } @NotNull diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/generation/OverrideImplementExploreUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/generation/OverrideImplementExploreUtil.java index 35e24fa88bd2..52e9ab691092 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/generation/OverrideImplementExploreUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/generation/OverrideImplementExploreUtil.java @@ -4,6 +4,7 @@ import com.intellij.codeInsight.MemberImplementorExplorer; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.infos.CandidateInfo; import com.intellij.psi.util.MethodSignature; @@ -63,9 +64,9 @@ public class OverrideImplementExploreUtil { } Map<MethodSignature, PsiMethod> map = hisClass.isInterface() || method.hasModifierProperty(PsiModifier.ABSTRACT) ? abstracts : concretes; - PsiMethod other = map.get(signature); - if (other == null || preferLeftForImplement(method, other)) { - map.put(signature, method); + fillMap(signature, method, map); + if (isDefaultMethod(aClass, method)) { + fillMap(signature, method, concretes); } } @@ -92,6 +93,18 @@ public class OverrideImplementExploreUtil { return result; } + private static boolean isDefaultMethod(PsiClass aClass, PsiMethod method) { + return method.hasModifierProperty(PsiModifier.DEFAULT) && + PsiUtil.getLanguageLevel(aClass).isAtLeast(LanguageLevel.JDK_1_8); + } + + private static void fillMap(HierarchicalMethodSignature signature, PsiMethod method, Map<MethodSignature, PsiMethod> map) { + final PsiMethod other = map.get(signature); + if (other == null || preferLeftForImplement(method, other)) { + map.put(signature, method); + } + } + public static void collectMethodsToImplement(PsiClass aClass, Map<MethodSignature, PsiMethod> abstracts, Map<MethodSignature, PsiMethod> finals, @@ -103,7 +116,8 @@ public class OverrideImplementExploreUtil { PsiMethod concrete = concretes.get(signature); if (concrete == null || PsiUtil.getAccessLevel(concrete.getModifierList()) < PsiUtil.getAccessLevel(abstractOne.getModifierList()) - || !abstractOne.getContainingClass().isInterface() && abstractOne.getContainingClass().isInheritor(concrete.getContainingClass(), true)) { + || !abstractOne.getContainingClass().isInterface() && abstractOne.getContainingClass().isInheritor(concrete.getContainingClass(), true) + || isDefaultMethod(aClass, abstractOne)) { if (finals.get(signature) == null) { PsiSubstitutor subst = correctSubstitutor(abstractOne, signature.getSubstitutor()); CandidateInfo info = new CandidateInfo(abstractOne, subst); |