Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions test-app/build-tools/android-metadata-generator/build.gradle
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
/*
* Packs metadata generator in a .tgz file in ~/dist folder
* To build .tgz
* gradlew packmg
* To build jar
* gradlew jarmg
*/
apply plugin: "java"
apply plugin: 'java'
apply plugin: 'kotlin'

sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Expand All @@ -26,6 +20,9 @@ sourceSets {
java {
srcDir 'src/src'
}
kotlin {
srcDirs += 'src/src'
}
}
}

Expand All @@ -35,6 +32,10 @@ compileJava {

compileJava.outputs.dir("$rootDir/dist/classes")

compileKotlin {
kotlinOptions.allWarningsAsErrors = true
}

repositories {
google()
mavenCentral()
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@

import com.telerik.metadata.analytics.AnalyticsCollector;
import com.telerik.metadata.analytics.AnalyticsCollectorProvider;
import com.telerik.metadata.desc.ClassDescriptor;
import com.telerik.metadata.kotlin.classes.KotlinClassMetadataParser;
import com.telerik.metadata.kotlin.classes.impl.KotlinClassMetadataParserImpl;
import com.telerik.metadata.parsing.classes.bytecode.NativeClassBytecodeDescriptor;
import com.telerik.metadata.parsing.classes.NativeClassDescriptor;
import com.telerik.metadata.parsing.classes.kotlin.metadata.ClassMetadataParser;
import com.telerik.metadata.parsing.classes.kotlin.metadata.bytecode.BytecodeClassMetadataParser;

import org.apache.bcel.classfile.ClassParser;

Expand All @@ -17,18 +18,18 @@

public class ClassDirectory implements ClassMapProvider {
private final String path;
private final Map<String, ClassDescriptor> classMap;
private static final KotlinClassMetadataParser kotlinClassMetadataParser = new KotlinClassMetadataParserImpl();
private final Map<String, NativeClassDescriptor> classMap;
private static final ClassMetadataParser kotlinClassMetadataParser = new BytecodeClassMetadataParser();
private static final AnalyticsCollector analyticsCollector = AnalyticsCollectorProvider.getInstance().provideAnalyticsCollector();
private static final String CLASS_EXT = ".class";
private static final String DEX_EXT = ".dex";

private ClassDirectory(String path) {
this.path = path;
this.classMap = new HashMap<String, ClassDescriptor>();
this.classMap = new HashMap<String, NativeClassDescriptor>();
}

public Map<String, ClassDescriptor> getClassMap() {
public Map<String, NativeClassDescriptor> getClassMap() {
return classMap;
}

Expand All @@ -50,7 +51,7 @@ private static void readDirectory(ClassDirectory dir, String path)
if (file.isFile()) {
String name = file.getName();
if (name.endsWith(CLASS_EXT)) {
ClassDescriptor clazz = getClassDescriptor(name, file);
NativeClassDescriptor clazz = getClassDescriptor(name, file);
dir.classMap.put(clazz.getClassName(), clazz);
}
} else if (file.isDirectory()) {
Expand All @@ -62,11 +63,11 @@ private static void readDirectory(ClassDirectory dir, String path)
}
}

private static ClassDescriptor getClassDescriptor(String name, File file) throws IOException {
ClassDescriptor clazz = null;
private static NativeClassDescriptor getClassDescriptor(String name, File file) throws IOException {
NativeClassDescriptor clazz = null;
if (name.endsWith(CLASS_EXT)) {
ClassParser cp = new ClassParser(file.getAbsolutePath());
clazz = new com.telerik.metadata.bcl.ClassInfo(cp.parse());
clazz = new NativeClassBytecodeDescriptor(cp.parse());
markIfKotlinClass(clazz);
} else if (name.endsWith(DEX_EXT)) {
// TODO:
Expand All @@ -75,7 +76,7 @@ private static ClassDescriptor getClassDescriptor(String name, File file) throws
return clazz;
}

private static void markIfKotlinClass(ClassDescriptor classDescriptor) {
private static void markIfKotlinClass(NativeClassDescriptor classDescriptor) {
if (kotlinClassMetadataParser.wasKotlinClass(classDescriptor)) {
analyticsCollector.markHasKotlinRuntimeClassesIfNotMarkedAlready();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.telerik.metadata;

import com.telerik.metadata.desc.ClassDescriptor;
import com.telerik.metadata.parsing.classes.NativeClassDescriptor;

import java.util.Map;

public interface ClassMapProvider {
Map<String, ClassDescriptor> getClassMap();
Map<String, NativeClassDescriptor> getClassMap();

String getPath();
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.telerik.metadata;

import com.telerik.metadata.desc.ClassDescriptor;
import com.telerik.metadata.parsing.classes.NativeClassDescriptor;

import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -15,8 +15,8 @@ public static void addToCache(ClassMapProvider classMapProvider) {
cachedProviders.add(classMapProvider);
}

public static ClassDescriptor findClass(String className) {
ClassDescriptor clazz = null;
public static NativeClassDescriptor findClass(String className) {
NativeClassDescriptor clazz = null;
for (ClassMapProvider classMapProvider : cachedProviders) {
clazz = classMapProvider.getClassMap().get(className);
if (clazz != null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,27 @@
package com.telerik.metadata;

import com.telerik.metadata.desc.ClassDescriptor;
import com.telerik.metadata.desc.MethodDescriptor;
import com.telerik.metadata.desc.TypeDescriptor;
import com.telerik.metadata.parsing.classes.NativeClassDescriptor;
import com.telerik.metadata.parsing.classes.NativeMethodDescriptor;
import com.telerik.metadata.parsing.classes.NativeTypeDescriptor;

import java.util.ArrayList;

import org.apache.bcel.generic.Type;

public class ClassUtil {
private ClassUtil() {
}

public static boolean isPrimitive(ClassDescriptor clazz) {
public static boolean isPrimitive(NativeClassDescriptor clazz) {
boolean isPrimitive = !clazz.isClass() && !clazz.isEnum()
&& !clazz.isInterface();
return isPrimitive;
}

public static boolean isPrimitive(TypeDescriptor type) {
boolean isPrimitive = type.equals(TypeDescriptor.BOOLEAN)
|| type.equals(TypeDescriptor.CHAR) || type.equals(TypeDescriptor.BYTE)
|| type.equals(TypeDescriptor.SHORT) || type.equals(TypeDescriptor.INT)
|| type.equals(TypeDescriptor.LONG) || type.equals(TypeDescriptor.FLOAT)
|| type.equals(TypeDescriptor.DOUBLE) || type.equals(TypeDescriptor.VOID);
public static boolean isPrimitive(NativeTypeDescriptor type) {
boolean isPrimitive = type.equals(NativeTypeDescriptor.Companion.getBOOLEAN())
|| type.equals(NativeTypeDescriptor.Companion.getCHAR()) || type.equals(NativeTypeDescriptor.Companion.getBYTE())
|| type.equals(NativeTypeDescriptor.Companion.getSHORT()) || type.equals(NativeTypeDescriptor.Companion.getINT())
|| type.equals(NativeTypeDescriptor.Companion.getLONG()) || type.equals(NativeTypeDescriptor.Companion.getFLOAT())
|| type.equals(NativeTypeDescriptor.Companion.getDOUBLE()) || type.equals(NativeTypeDescriptor.Companion.getVOID());

return isPrimitive;
}
Expand All @@ -36,7 +34,7 @@ public static boolean isPrimitive(String name) {
return isPrimitive;
}

public static boolean isArray(ClassDescriptor clazz) {
public static boolean isArray(NativeClassDescriptor clazz) {
boolean isArray = isArray(clazz.getClassName());
return isArray;
}
Expand All @@ -46,8 +44,8 @@ public static boolean isArray(String className) {
return isArray;
}

public static ClassDescriptor getEnclosingClass(ClassDescriptor clazz) {
ClassDescriptor enclosingClass = null;
public static NativeClassDescriptor getEnclosingClass(NativeClassDescriptor clazz) {
NativeClassDescriptor enclosingClass = null;

String className = clazz.getClassName();
int idx = className.lastIndexOf("$");
Expand All @@ -59,7 +57,7 @@ public static ClassDescriptor getEnclosingClass(ClassDescriptor clazz) {
return enclosingClass;
}

public static String getSimpleName(ClassDescriptor clazz) {
public static String getSimpleName(NativeClassDescriptor clazz) {
String className = clazz.getClassName();
int idx = className.lastIndexOf("$");
if (idx < 0) {
Expand All @@ -69,19 +67,19 @@ public static String getSimpleName(ClassDescriptor clazz) {
return simpleName;
}

public static MethodDescriptor[] getAllMethods(ClassDescriptor clazz) {
ArrayList<MethodDescriptor> methods = new ArrayList<MethodDescriptor>();
ClassDescriptor currentClass = clazz;
public static NativeMethodDescriptor[] getAllMethods(NativeClassDescriptor clazz) {
ArrayList<NativeMethodDescriptor> methods = new ArrayList<NativeMethodDescriptor>();
NativeClassDescriptor currentClass = clazz;
while (currentClass != null) {
MethodDescriptor[] currentClassMethods = currentClass.getMethods();
for (MethodDescriptor m : currentClassMethods) {
NativeMethodDescriptor[] currentClassMethods = currentClass.getMethods();
for (NativeMethodDescriptor m : currentClassMethods) {
if ((m.isPublic() || m.isProtected()) && !m.isSynthetic()) {
methods.add(m);
}
}
currentClass = getSuperclass(currentClass);
}
return methods.toArray(new MethodDescriptor[0]);
return methods.toArray(new NativeMethodDescriptor[0]);
}

public static String getCanonicalName(String className) {
Expand All @@ -95,17 +93,17 @@ public static String getCanonicalName(String className) {
return canonicalName;
}

public static ClassDescriptor getSuperclass(ClassDescriptor clazz) {
ClassDescriptor superClass = null;
public static NativeClassDescriptor getSuperclass(NativeClassDescriptor clazz) {
NativeClassDescriptor superClass = null;
if (!clazz.getClassName().equals("java.lang.Object")) {
String superClassName = clazz.getSuperclassName();
superClass = ClassRepo.findClass(superClassName);
}
return superClass;
}

public static ClassDescriptor getClassByName(String className) {
ClassDescriptor clazz = ClassRepo.findClass(className);
public static NativeClassDescriptor getClassByName(String className) {
NativeClassDescriptor clazz = ClassRepo.findClass(className);
return clazz;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
package com.telerik.metadata;

import com.telerik.metadata.desc.ClassDescriptor;
import com.telerik.metadata.desc.ExtensionFunctionDescriptor;
import com.telerik.metadata.desc.MethodDescriptor;
import com.telerik.metadata.desc.TypeDescriptor;
import com.telerik.metadata.parsing.classes.NativeClassDescriptor;
import com.telerik.metadata.parsing.classes.kotlin.extensions.KotlinExtensionFunctionDescriptor;
import com.telerik.metadata.parsing.classes.NativeMethodDescriptor;
import com.telerik.metadata.parsing.classes.NativeTypeDescriptor;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class TreeNode {
public static class MethodInfo {
public MethodInfo(MethodDescriptor m) {
public MethodInfo(NativeMethodDescriptor m) {
this.name = m.getName();
this.sig = m.getSignature();
this.isResolved = false;
this.isExtensionFunction = m instanceof ExtensionFunctionDescriptor;
this.isExtensionFunction = m instanceof KotlinExtensionFunctionDescriptor;

signature = new ArrayList<>();
}
Expand Down Expand Up @@ -109,35 +109,35 @@ public TreeNode() {
public static final TreeNode BOOLEAN = getPrimitive("Z", (byte) 7);
public static final TreeNode CHAR = getPrimitive("C", (byte) 8);

public static TreeNode getPrimitive(TypeDescriptor type) throws Exception {
public static TreeNode getPrimitive(NativeTypeDescriptor type) throws Exception {
if (!ClassUtil.isPrimitive(type)) {
throw new Exception("type must be primitive");
}

if (type.equals(TypeDescriptor.BYTE)) {
if (type.equals(NativeTypeDescriptor.Companion.getBYTE())) {
return TreeNode.BYTE;
} else if (type.equals(TypeDescriptor.SHORT)) {
} else if (type.equals(NativeTypeDescriptor.Companion.getSHORT())) {
return TreeNode.SHORT;
} else if (type.equals(TypeDescriptor.INT)) {
} else if (type.equals(NativeTypeDescriptor.Companion.getINT())) {
return TreeNode.INTEGER;
} else if (type.equals(TypeDescriptor.LONG)) {
} else if (type.equals(NativeTypeDescriptor.Companion.getLONG())) {
return TreeNode.LONG;
} else if (type.equals(TypeDescriptor.FLOAT)) {
} else if (type.equals(NativeTypeDescriptor.Companion.getFLOAT())) {
return TreeNode.FLOAT;
} else if (type.equals(TypeDescriptor.DOUBLE)) {
} else if (type.equals(NativeTypeDescriptor.Companion.getDOUBLE())) {
return TreeNode.DOUBLE;
} else if (type.equals(TypeDescriptor.BOOLEAN)) {
} else if (type.equals(NativeTypeDescriptor.Companion.getBOOLEAN())) {
return TreeNode.BOOLEAN;
} else if (type.equals(TypeDescriptor.CHAR)) {
} else if (type.equals(NativeTypeDescriptor.Companion.getCHAR())) {
return TreeNode.CHAR;
} else if (type.equals(TypeDescriptor.VOID)) {
} else if (type.equals(NativeTypeDescriptor.Companion.getVOID())) {
return null;
} else {
throw new Exception("unknown type=" + type.toString());
}
}

public static TreeNode getPrimitive(ClassDescriptor clazz) throws Exception {
public static TreeNode getPrimitive(NativeClassDescriptor clazz) throws Exception {
if (!ClassUtil.isPrimitive(clazz)) {
throw new Exception("clazz must be primitive");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.telerik.metadata.analytics;

import com.telerik.metadata.analytics.impl.EnabledAnalyticsCollectorImpl;
import com.telerik.metadata.analytics.impl.NoOpAnalyticsCollector;
import com.telerik.metadata.analytics.enabled.DefaultAnalyticsCollector;
import com.telerik.metadata.analytics.disabled.NoOpAnalyticsCollector;

public class AnalyticsCollectorProvider {
private static final AnalyticsCollectorProvider ourInstance = new AnalyticsCollectorProvider();
Expand All @@ -16,7 +16,7 @@ private AnalyticsCollectorProvider() {
public AnalyticsCollector provideAnalyticsCollector() {
if (AnalyticsConfiguration.areAnalyticsEnabled()) {
String analyticsFilePath = AnalyticsConfiguration.getAnalyticsFilePath();
return new EnabledAnalyticsCollectorImpl(analyticsFilePath);
return new DefaultAnalyticsCollector(analyticsFilePath);
} else {
return new NoOpAnalyticsCollector();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.telerik.metadata.analytics.impl;
package com.telerik.metadata.analytics.disabled;

import com.telerik.metadata.analytics.AnalyticsCollector;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.telerik.metadata.analytics.impl;
package com.telerik.metadata.analytics.enabled;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
Expand All @@ -11,7 +11,7 @@
import java.nio.file.Path;
import java.nio.file.Paths;

public final class EnabledAnalyticsCollectorImpl implements AnalyticsCollector {
public final class DefaultAnalyticsCollector implements AnalyticsCollector {

private static final String HAS_KOTLIN_RUNTIME_CLASSES_JSON_PROPERTY_NAME = "hasKotlinRuntimeClasses";
private static final String HAS_USE_KOTLIN_PROPERTY_IN_APP_JSON_PROPERTY_NAME = "hasUseKotlinPropertyInApp";
Expand All @@ -23,11 +23,11 @@ public final class EnabledAnalyticsCollectorImpl implements AnalyticsCollector {
private boolean hasMarked;

public static void main(String... args) {
EnabledAnalyticsCollectorImpl a = new EnabledAnalyticsCollectorImpl("/Users/vmutafov/work/android_runtime_release/android-runtime/test-app/analytics/build-statistics.json");
DefaultAnalyticsCollector a = new DefaultAnalyticsCollector("/Users/vmutafov/work/android_runtime_release/android-runtime/test-app/analytics/build-statistics.json");
a.markHasKotlinRuntimeClassesIfNotMarkedAlready();
}

public EnabledAnalyticsCollectorImpl(String analyticsFilePath) {
public DefaultAnalyticsCollector(String analyticsFilePath) {
this.analyticsFilePath = analyticsFilePath;
this.gson = new GsonBuilder().setPrettyPrinting().create();
this.hasMarked = false;
Expand Down
Loading