diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-02-01 12:45:45 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2022-02-01 12:45:45 +0100 |
commit | 3973e39a4637be97a5579e7a657476e1a0b8d917 (patch) | |
tree | bb110e2bee8eca7afc646c44f35152c44f4d6736 /bundle-plugin | |
parent | a3ac1da80933462fcb332839074efbddaf661023 (diff) |
Import types referenced in lambdas
Diffstat (limited to 'bundle-plugin')
13 files changed, 64 insertions, 12 deletions
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java index 054e820b1a4..7c34539921b 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java @@ -13,7 +13,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.Optional; - /** * Main entry point for class analysis * @@ -21,6 +20,7 @@ import java.util.Optional; * @author ollivir */ public class Analyze { + public static ClassFileMetaData analyzeClass(File classFile) { return analyzeClass(classFile, null); } @@ -44,7 +44,7 @@ public class Analyze { } static Optional<String> internalNameToClassName(String internalClassName) { - if(internalClassName == null) { + if (internalClassName == null) { return Optional.empty(); } else { return getClassName(Type.getObjectType(internalClassName)); @@ -53,12 +53,14 @@ public class Analyze { static Optional<String> getClassName(Type aType) { switch (aType.getSort()) { - case Type.ARRAY: - return getClassName(aType.getElementType()); - case Type.OBJECT: - return Optional.of(aType.getClassName()); - default: - return Optional.empty(); + case Type.ARRAY: + return getClassName(aType.getElementType()); + case Type.OBJECT: + return Optional.of(aType.getClassName()); + case Type.METHOD: + return getClassName(aType.getReturnType()); + default: + return Optional.empty(); } } @@ -89,4 +91,5 @@ public class Analyze { } }; } + } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java index 88b752ae945..307509f0452 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java @@ -24,8 +24,9 @@ import java.util.Set; * @author ollivir */ class AnalyzeClassVisitor extends ClassVisitor implements ImportCollector { + private String name = null; - private Set<String> imports = new HashSet<>(); + private final Set<String> imports = new HashSet<>(); private Optional<ExportPackageAnnotation> exportPackageAnnotation = Optional.empty(); private final Optional<ArtifactVersion> defaultExportPackageVersion; @@ -168,4 +169,5 @@ class AnalyzeClassVisitor extends ClassVisitor implements ImportCollector { assert (!imports.contains("int")); return new ClassFileMetaData(name, imports, exportPackageAnnotation); } + } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeFieldVisitor.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeFieldVisitor.java index b4c44c9ed40..051df41d62b 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeFieldVisitor.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeFieldVisitor.java @@ -14,6 +14,7 @@ import java.util.Set; * @author ollivir */ public class AnalyzeFieldVisitor extends FieldVisitor implements ImportCollector { + private final AnalyzeClassVisitor analyzeClassVisitor; private final Set<String> imports = new HashSet<>(); @@ -46,4 +47,5 @@ public class AnalyzeFieldVisitor extends FieldVisitor implements ImportCollector public void visitEnd() { analyzeClassVisitor.addImports(imports); } + } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeMethodVisitor.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeMethodVisitor.java index b7d1291d54a..7913f315cdd 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeMethodVisitor.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeMethodVisitor.java @@ -20,7 +20,9 @@ import java.util.Set; * @author ollivir */ class AnalyzeMethodVisitor extends MethodVisitor implements ImportCollector { + private final Set<String> imports = new HashSet<>(); + private final AnalyzeClassVisitor analyzeClassVisitor; AnalyzeMethodVisitor(AnalyzeClassVisitor analyzeClassVisitor) { @@ -104,13 +106,14 @@ class AnalyzeMethodVisitor extends MethodVisitor implements ImportCollector { @Override public void visitInvokeDynamicInsn(String name, String desc, Handle bootstrapMethod, Object... bootstrapMethodArgs) { + addImportWithTypeDesc(desc); for (Object arg : bootstrapMethodArgs) { if (arg instanceof Type) { addImport((Type) arg); } else if (arg instanceof Handle) { addImportWithInternalName(((Handle) arg).getOwner()); Arrays.asList(Type.getArgumentTypes(desc)).forEach(this::addImport); - } else if ((arg instanceof Number) == false && (arg instanceof String) == false) { + } else if ( ! (arg instanceof Number) && ! (arg instanceof String)) { throw new AssertionError("Unexpected type " + arg.getClass() + " with value '" + arg + "'"); } } @@ -165,4 +168,5 @@ class AnalyzeMethodVisitor extends MethodVisitor implements ImportCollector { @Override public void visitCode() { } + } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeSignatureVisitor.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeSignatureVisitor.java index d3c32e11201..61c37e99edf 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeSignatureVisitor.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeSignatureVisitor.java @@ -12,10 +12,10 @@ import java.util.Set; * @author Tony Vaagenes * @author ollivir */ - class AnalyzeSignatureVisitor extends SignatureVisitor implements ImportCollector { + private final AnalyzeClassVisitor analyzeClassVisitor; - private Set<String> imports = new HashSet<>(); + private final Set<String> imports = new HashSet<>(); AnalyzeSignatureVisitor(AnalyzeClassVisitor analyzeClassVisitor) { super(Opcodes.ASM7); @@ -116,4 +116,5 @@ class AnalyzeSignatureVisitor extends SignatureVisitor implements ImportCollecto if (signature != null) new SignatureReader(signature).acceptType(new AnalyzeSignatureVisitor(analyzeClassVisitor)); } + } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ClassFileMetaData.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ClassFileMetaData.java index 4195f342e92..5601430a27f 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ClassFileMetaData.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ClassFileMetaData.java @@ -11,6 +11,7 @@ import java.util.Set; * @author ollivir */ public class ClassFileMetaData { + private final String name; private final Set<String> referencedClasses; private final Optional<ExportPackageAnnotation> exportPackage; @@ -32,4 +33,5 @@ public class ClassFileMetaData { public Optional<ExportPackageAnnotation> getExportPackage() { return exportPackage; } + } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ExportPackageAnnotation.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ExportPackageAnnotation.java index 955056b2306..7f3fb9522f7 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ExportPackageAnnotation.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ExportPackageAnnotation.java @@ -9,6 +9,7 @@ import java.util.regex.Pattern; * @author ollivir */ public class ExportPackageAnnotation { + private final int major; private final int minor; private final int micro; @@ -59,4 +60,5 @@ public class ExportPackageAnnotation { public int hashCode() { return Objects.hash(major, minor, micro, qualifier); } + } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ImportCollector.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ImportCollector.java index 1dc1e49897d..e341ef1a80f 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ImportCollector.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ImportCollector.java @@ -11,6 +11,7 @@ import java.util.Set; * @author ollivir */ public interface ImportCollector { + Set<String> imports(); default void addImportWithTypeDesc(String typeDescriptor) { @@ -32,4 +33,5 @@ public interface ImportCollector { default void addImport(Optional<String> anImport) { anImport.ifPresent(pkg -> imports().add(pkg)); } + } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Packages.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Packages.java index 3d20bfd54df..9eef8a55c01 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Packages.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Packages.java @@ -11,6 +11,7 @@ import java.util.Set; * @author ollivir */ public class Packages { + public static class PackageMetaData { public final Set<String> definedPackages; public final Set<String> referencedExternalPackages; @@ -40,4 +41,5 @@ public class Packages { referencedPackages.removeAll(definedPackages); return new PackageMetaData(definedPackages, referencedPackages); } + } diff --git a/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/AnalyzeMethodBodyTest.java b/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/AnalyzeMethodBodyTest.java index 4502f88d158..1bb6cb8976e 100644 --- a/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/AnalyzeMethodBodyTest.java +++ b/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/AnalyzeMethodBodyTest.java @@ -7,6 +7,7 @@ import com.yahoo.container.plugin.classanalysis.sampleclasses.Derived; import com.yahoo.container.plugin.classanalysis.sampleclasses.Dummy; import com.yahoo.container.plugin.classanalysis.sampleclasses.Fields; import com.yahoo.container.plugin.classanalysis.sampleclasses.Interface1; +import com.yahoo.container.plugin.classanalysis.sampleclasses.Interface3; import com.yahoo.container.plugin.classanalysis.sampleclasses.Methods; import org.junit.Test; @@ -24,6 +25,7 @@ import static org.junit.Assert.assertTrue; * @author Tony Vaagenes */ public class AnalyzeMethodBodyTest { + @Test public void require_that_class_of_locals_are_included() { assertTrue(analyzeClass(Methods.class).getReferencedClasses().contains(name(Base.class))); @@ -65,6 +67,11 @@ public class AnalyzeMethodBodyTest { } @Test + public void require_that_functional_interface_usage_is_included() { + assertTrue(analyzeClass(Methods.class).getReferencedClasses().contains(name(Interface3.class))); + } + + @Test public void require_that_class_owning_method_handler_is_included() { assertTrue(analyzeClass(Methods.class).getReferencedClasses().contains(name(ClassWithMethod.class))); } diff --git a/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/TestUtilities.java b/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/TestUtilities.java index 9eacc0625b5..c2567e96ed9 100644 --- a/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/TestUtilities.java +++ b/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/TestUtilities.java @@ -8,6 +8,7 @@ import java.io.File; * @author ollivir */ public class TestUtilities { + public static ClassFileMetaData analyzeClass(Class<?> clazz) { return Analyze.analyzeClass(classFile(name(clazz))); } @@ -19,4 +20,5 @@ public class TestUtilities { public static String name(Class<?> clazz) { return clazz.getName(); } + } diff --git a/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/sampleclasses/Interface3.java b/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/sampleclasses/Interface3.java new file mode 100644 index 00000000000..d492cd6ed50 --- /dev/null +++ b/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/sampleclasses/Interface3.java @@ -0,0 +1,11 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.plugin.classanalysis.sampleclasses; + +/** + * Input for class analysis tests. + * + * @author bratseth + */ +public interface Interface3 extends java.util.function.Supplier<String> { + +} diff --git a/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/sampleclasses/Methods.java b/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/sampleclasses/Methods.java index fcc7057dac8..3fba4b3381b 100644 --- a/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/sampleclasses/Methods.java +++ b/bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/sampleclasses/Methods.java @@ -3,6 +3,7 @@ package com.yahoo.container.plugin.classanalysis.sampleclasses; import java.util.List; import java.util.Map; +import java.util.function.Supplier; /** * Input for class analysis tests. @@ -10,6 +11,7 @@ import java.util.Map; */ @SuppressWarnings("unused") public class Methods { + public void method1() { Base b = new Base(); System.out.println(Fields.field2.size()); @@ -29,5 +31,15 @@ public class Methods { Derived d = new Derived(); } + public void method3() { + var result = methodTakingFunctionalArgument((Interface3)() -> "hello"); + System.out.println(result); + } + + public String methodTakingFunctionalArgument(Supplier<String> function) { + return function.get(); + } + public void methodTakingGenericArgument(Map<String, List<Dummy>> map) {} + } |