summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-02-01 12:45:45 +0100
committerJon Bratseth <bratseth@gmail.com>2022-02-01 12:45:45 +0100
commit3973e39a4637be97a5579e7a657476e1a0b8d917 (patch)
treebb110e2bee8eca7afc646c44f35152c44f4d6736
parenta3ac1da80933462fcb332839074efbddaf661023 (diff)
Import types referenced in lambdas
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java19
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java4
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeFieldVisitor.java2
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeMethodVisitor.java6
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeSignatureVisitor.java5
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ClassFileMetaData.java2
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ExportPackageAnnotation.java2
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/ImportCollector.java2
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Packages.java2
-rw-r--r--bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/AnalyzeMethodBodyTest.java7
-rw-r--r--bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/TestUtilities.java2
-rw-r--r--bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/sampleclasses/Interface3.java11
-rw-r--r--bundle-plugin/src/test/java/com/yahoo/container/plugin/classanalysis/sampleclasses/Methods.java12
-rw-r--r--container-search/src/test/java/com/yahoo/search/test/QueryTestCase.java14
14 files changed, 78 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) {}
+
}
diff --git a/container-search/src/test/java/com/yahoo/search/test/QueryTestCase.java b/container-search/src/test/java/com/yahoo/search/test/QueryTestCase.java
index f6273fdf723..312fe175270 100644
--- a/container-search/src/test/java/com/yahoo/search/test/QueryTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/test/QueryTestCase.java
@@ -2,6 +2,7 @@
package com.yahoo.search.test;
import com.yahoo.component.chain.Chain;
+import com.yahoo.data.JsonProducer;
import com.yahoo.language.Language;
import com.yahoo.language.Linguistics;
import com.yahoo.language.detect.Detection;
@@ -15,6 +16,7 @@ import com.yahoo.prelude.Index;
import com.yahoo.prelude.IndexFacts;
import com.yahoo.prelude.IndexModel;
import com.yahoo.prelude.SearchDefinition;
+import com.yahoo.prelude.fastsearch.FastHit;
import com.yahoo.prelude.query.AndItem;
import com.yahoo.prelude.query.AndSegmentItem;
import com.yahoo.prelude.query.CompositeItem;
@@ -40,6 +42,7 @@ import com.yahoo.search.query.profile.types.QueryProfileType;
import com.yahoo.search.result.Hit;
import com.yahoo.search.searchchain.Execution;
import com.yahoo.yolean.Exceptions;
+import org.json.JSONObject;
import org.junit.Ignore;
import org.junit.Test;
@@ -69,6 +72,17 @@ import static org.junit.Assert.fail;
public class QueryTestCase {
@Test
+ public void testIt() throws Exception {
+ JSONObject newroot = new JSONObject("{\"key\": 3}");
+ var hit = new FastHit();
+ hit.setField("data", (JsonProducer)s -> s.append(newroot));
+ var field = hit.getField("data");
+ if (field instanceof JsonProducer) {
+ System.out.println((((JsonProducer) field).toJson()));
+ }
+ }
+
+ @Test
public void testSimpleFunctionality() {
Query q = new Query(QueryTestCase.httpEncode("/sdfsd.html?query=this is a simple query&aParameter"));
assertEquals("this is a simple query", q.getModel().getQueryString());