summaryrefslogtreecommitdiff
path: root/java/java-psi-impl/src/com/intellij/codeInsight
diff options
context:
space:
mode:
authorJean-Baptiste Queru <jbq@google.com>2013-04-01 14:41:51 -0700
committerJean-Baptiste Queru <jbq@google.com>2013-04-01 14:41:51 -0700
commit2bd2b7c2623d4266384e890271869efc044aabff (patch)
tree0b31f50e55975b6354ed458314e17b4441bb4e17 /java/java-psi-impl/src/com/intellij/codeInsight
parent1d526b16d476792ca7ce47616d55833115e8d6ab (diff)
downloadidea-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')
-rw-r--r--java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java44
-rw-r--r--java/java-psi-impl/src/com/intellij/codeInsight/ExceptionUtil.java24
-rw-r--r--java/java-psi-impl/src/com/intellij/codeInsight/generation/OverrideImplementExploreUtil.java22
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);