From df5d7e09603c97adb19fce7cf0bf37198d3b2749 Mon Sep 17 00:00:00 2001 From: Haifeng Shi Date: Tue, 28 Feb 2023 10:14:41 -0500 Subject: [PATCH 1/5] get default type for new class tree --- src/checkers/inference/util/SlotDefaultTypeResolver.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/checkers/inference/util/SlotDefaultTypeResolver.java b/src/checkers/inference/util/SlotDefaultTypeResolver.java index 2f081931..577051fe 100644 --- a/src/checkers/inference/util/SlotDefaultTypeResolver.java +++ b/src/checkers/inference/util/SlotDefaultTypeResolver.java @@ -3,6 +3,7 @@ import com.sun.source.tree.AnnotatedTypeTree; import com.sun.source.tree.ArrayTypeTree; import com.sun.source.tree.ClassTree; +import com.sun.source.tree.NewClassTree; import com.sun.source.tree.ParameterizedTypeTree; import com.sun.source.tree.PrimitiveTypeTree; import com.sun.source.tree.Tree; @@ -185,5 +186,12 @@ public Void visitAnnotatedType(AnnotatedTypeTree tree, Void unused) { return super.visitAnnotatedType(tree, unused); } + + @Override + public Void visitNewClass(NewClassTree tree, Void unused) { + AnnotatedTypeMirror defaultType = getDefaultTypeFor(tree); + defaultTypes.put(tree.getIdentifier(), defaultType); + return super.visitNewClass(tree, unused); + } } } From 09ffa389597bc6e39635651bfc26fc8e873fb2f7 Mon Sep 17 00:00:00 2001 From: Haifeng Shi Date: Tue, 28 Feb 2023 12:19:22 -0500 Subject: [PATCH 2/5] fix assertion failure --- src/checkers/inference/util/SlotDefaultTypeResolver.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/checkers/inference/util/SlotDefaultTypeResolver.java b/src/checkers/inference/util/SlotDefaultTypeResolver.java index 577051fe..d5aed1e2 100644 --- a/src/checkers/inference/util/SlotDefaultTypeResolver.java +++ b/src/checkers/inference/util/SlotDefaultTypeResolver.java @@ -3,6 +3,7 @@ import com.sun.source.tree.AnnotatedTypeTree; import com.sun.source.tree.ArrayTypeTree; import com.sun.source.tree.ClassTree; +import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.NewClassTree; import com.sun.source.tree.ParameterizedTypeTree; import com.sun.source.tree.PrimitiveTypeTree; @@ -190,7 +191,11 @@ public Void visitAnnotatedType(AnnotatedTypeTree tree, Void unused) { @Override public Void visitNewClass(NewClassTree tree, Void unused) { AnnotatedTypeMirror defaultType = getDefaultTypeFor(tree); - defaultTypes.put(tree.getIdentifier(), defaultType); + ExpressionTree type = tree.getIdentifier(); + if ((type instanceof ParameterizedTypeTree) && !((ParameterizedTypeTree) type).getTypeArguments().isEmpty()) + return super.visitNewClass(tree, unused); + + defaultTypes.put(type, defaultType); return super.visitNewClass(tree, unused); } } From f6279cf09e82f558f9b5721118c7612c839b6df5 Mon Sep 17 00:00:00 2001 From: Haifeng Shi Date: Thu, 2 Mar 2023 10:03:28 -0500 Subject: [PATCH 3/5] workaround if it's an anonymous class --- src/checkers/inference/util/SlotDefaultTypeResolver.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/checkers/inference/util/SlotDefaultTypeResolver.java b/src/checkers/inference/util/SlotDefaultTypeResolver.java index d5aed1e2..34f314ef 100644 --- a/src/checkers/inference/util/SlotDefaultTypeResolver.java +++ b/src/checkers/inference/util/SlotDefaultTypeResolver.java @@ -191,11 +191,12 @@ public Void visitAnnotatedType(AnnotatedTypeTree tree, Void unused) { @Override public Void visitNewClass(NewClassTree tree, Void unused) { AnnotatedTypeMirror defaultType = getDefaultTypeFor(tree); - ExpressionTree type = tree.getIdentifier(); - if ((type instanceof ParameterizedTypeTree) && !((ParameterizedTypeTree) type).getTypeArguments().isEmpty()) + if (InferenceUtil.isAnonymousClass(tree)) { + // don't associate the identifier with the defaulttype if it's an anonymousclass + // should associate the identifier with the underlying type of the defaulttype and annotation to it. return super.visitNewClass(tree, unused); - - defaultTypes.put(type, defaultType); + } + defaultTypes.put(tree.getIdentifier(), defaultType); return super.visitNewClass(tree, unused); } } From fb56232410b9e7f97bd7f0c41645a8a56aa1b51b Mon Sep 17 00:00:00 2001 From: Haifeng Shi Date: Fri, 3 Mar 2023 13:47:48 -0500 Subject: [PATCH 4/5] get direct super types of the defaultType --- src/checkers/inference/util/SlotDefaultTypeResolver.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/checkers/inference/util/SlotDefaultTypeResolver.java b/src/checkers/inference/util/SlotDefaultTypeResolver.java index 34f314ef..f06520b7 100644 --- a/src/checkers/inference/util/SlotDefaultTypeResolver.java +++ b/src/checkers/inference/util/SlotDefaultTypeResolver.java @@ -192,11 +192,12 @@ public Void visitAnnotatedType(AnnotatedTypeTree tree, Void unused) { public Void visitNewClass(NewClassTree tree, Void unused) { AnnotatedTypeMirror defaultType = getDefaultTypeFor(tree); if (InferenceUtil.isAnonymousClass(tree)) { - // don't associate the identifier with the defaulttype if it's an anonymousclass - // should associate the identifier with the underlying type of the defaulttype and annotation to it. - return super.visitNewClass(tree, unused); + // don't associate the identifier with the defaultType if it's an anonymousclass + // should associate the identifier with the direct super type of the defaultType. + defaultTypes.put(tree.getIdentifier(), defaultType.directSupertypes().get(0)); + } else { + defaultTypes.put(tree.getIdentifier(), defaultType); } - defaultTypes.put(tree.getIdentifier(), defaultType); return super.visitNewClass(tree, unused); } } From 493963ae006811541522095078b757d1f3b9e72f Mon Sep 17 00:00:00 2001 From: Haifeng Shi Date: Fri, 3 Mar 2023 14:23:04 -0500 Subject: [PATCH 5/5] fix the case when the anonymous class's directSuper type is an interface --- src/checkers/inference/util/SlotDefaultTypeResolver.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/checkers/inference/util/SlotDefaultTypeResolver.java b/src/checkers/inference/util/SlotDefaultTypeResolver.java index f06520b7..e2034e46 100644 --- a/src/checkers/inference/util/SlotDefaultTypeResolver.java +++ b/src/checkers/inference/util/SlotDefaultTypeResolver.java @@ -194,7 +194,10 @@ public Void visitNewClass(NewClassTree tree, Void unused) { if (InferenceUtil.isAnonymousClass(tree)) { // don't associate the identifier with the defaultType if it's an anonymousclass // should associate the identifier with the direct super type of the defaultType. - defaultTypes.put(tree.getIdentifier(), defaultType.directSupertypes().get(0)); + // choose the last one of the directSupertypes, which is either the direct super class + // or implemented interface + List superTypes = defaultType.directSupertypes(); + defaultTypes.put(tree.getIdentifier(), superTypes.get(superTypes.size()-1)); } else { defaultTypes.put(tree.getIdentifier(), defaultType); }