Loading api/coverage/tools/ExtractFlaggedApis.kt +51 −33 Original line number Original line Diff line number Diff line Loading @@ -16,51 +16,69 @@ package android.platform.coverage package android.platform.coverage import com.android.tools.metalava.model.ClassItem import com.android.tools.metalava.model.MethodItem import com.android.tools.metalava.model.text.ApiFile import com.android.tools.metalava.model.text.ApiFile import java.io.File import java.io.File import java.io.FileWriter import java.io.FileWriter /** Usage: extract-flagged-apis <api text file> <output .pb file> */ /** Usage: extract-flagged-apis <api text file> <output .pb file> */ fun main(args: Array<String>) { fun main(args: Array<String>) { var cb = ApiFile.parseApi(listOf(File(args[0]))) val cb = ApiFile.parseApi(listOf(File(args[0]))) var builder = FlagApiMap.newBuilder() val builder = FlagApiMap.newBuilder() for (pkg in cb.getPackages().packages) { for (pkg in cb.getPackages().packages) { var packageName = pkg.qualifiedName() val packageName = pkg.qualifiedName() pkg.allClasses() pkg.allClasses() .filter { it.methods().size > 0 } .filter { it.methods().size > 0 } .forEach { .forEach { for (method in it.methods()) { extractFlaggedApisFromClass(it, it.methods(), packageName, builder) val flagValue = extractFlaggedApisFromClass(it, it.constructors(), packageName, builder) } } val flagApiMap = builder.build() FileWriter(args[1]).use { it.write(flagApiMap.toString()) } } fun extractFlaggedApisFromClass( classItem: ClassItem, methods: List<MethodItem>, packageName: String, builder: FlagApiMap.Builder ) { val classFlag = classItem.modifiers .findAnnotation("android.annotation.FlaggedApi") ?.findAttribute("value") ?.value ?.value() as? String for (method in methods) { val methodFlag = method.modifiers method.modifiers .findAnnotation("android.annotation.FlaggedApi") .findAnnotation("android.annotation.FlaggedApi") ?.findAttribute("value") ?.findAttribute("value") ?.value ?.value ?.value() ?.value() as? String if (flagValue != null && flagValue is String) { ?: classFlag var api = val api = JavaMethod.newBuilder() JavaMethod.newBuilder() .setPackageName(packageName) .setPackageName(packageName) .setClassName(it.fullName()) .setClassName(classItem.fullName()) .setMethodName(method.name()) .setMethodName(method.name()) for (param in method.parameters()) { for (param in method.parameters()) { api.addParameters(param.type().toTypeString()) api.addParameters(param.type().toTypeString()) } } if (builder.containsFlagToApi(flagValue)) { if (methodFlag != null) { var updatedApis = addFlaggedApi(builder, api, methodFlag) builder .getFlagToApiOrThrow(flagValue) .toBuilder() .addJavaMethods(api) .build() builder.putFlagToApi(flagValue, updatedApis) } else { var apis = FlaggedApis.newBuilder().addJavaMethods(api).build() builder.putFlagToApi(flagValue, apis) } } } } } } } fun addFlaggedApi(builder: FlagApiMap.Builder, api: JavaMethod.Builder, flag: String) { if (builder.containsFlagToApi(flag)) { val updatedApis = builder.getFlagToApiOrThrow(flag).toBuilder().addJavaMethods(api).build() builder.putFlagToApi(flag, updatedApis) } else { val apis = FlaggedApis.newBuilder().addJavaMethods(api).build() builder.putFlagToApi(flag, apis) } } val flagApiMap = builder.build() FileWriter(args[1]).use { it.write(flagApiMap.toString()) } } } Loading
api/coverage/tools/ExtractFlaggedApis.kt +51 −33 Original line number Original line Diff line number Diff line Loading @@ -16,51 +16,69 @@ package android.platform.coverage package android.platform.coverage import com.android.tools.metalava.model.ClassItem import com.android.tools.metalava.model.MethodItem import com.android.tools.metalava.model.text.ApiFile import com.android.tools.metalava.model.text.ApiFile import java.io.File import java.io.File import java.io.FileWriter import java.io.FileWriter /** Usage: extract-flagged-apis <api text file> <output .pb file> */ /** Usage: extract-flagged-apis <api text file> <output .pb file> */ fun main(args: Array<String>) { fun main(args: Array<String>) { var cb = ApiFile.parseApi(listOf(File(args[0]))) val cb = ApiFile.parseApi(listOf(File(args[0]))) var builder = FlagApiMap.newBuilder() val builder = FlagApiMap.newBuilder() for (pkg in cb.getPackages().packages) { for (pkg in cb.getPackages().packages) { var packageName = pkg.qualifiedName() val packageName = pkg.qualifiedName() pkg.allClasses() pkg.allClasses() .filter { it.methods().size > 0 } .filter { it.methods().size > 0 } .forEach { .forEach { for (method in it.methods()) { extractFlaggedApisFromClass(it, it.methods(), packageName, builder) val flagValue = extractFlaggedApisFromClass(it, it.constructors(), packageName, builder) } } val flagApiMap = builder.build() FileWriter(args[1]).use { it.write(flagApiMap.toString()) } } fun extractFlaggedApisFromClass( classItem: ClassItem, methods: List<MethodItem>, packageName: String, builder: FlagApiMap.Builder ) { val classFlag = classItem.modifiers .findAnnotation("android.annotation.FlaggedApi") ?.findAttribute("value") ?.value ?.value() as? String for (method in methods) { val methodFlag = method.modifiers method.modifiers .findAnnotation("android.annotation.FlaggedApi") .findAnnotation("android.annotation.FlaggedApi") ?.findAttribute("value") ?.findAttribute("value") ?.value ?.value ?.value() ?.value() as? String if (flagValue != null && flagValue is String) { ?: classFlag var api = val api = JavaMethod.newBuilder() JavaMethod.newBuilder() .setPackageName(packageName) .setPackageName(packageName) .setClassName(it.fullName()) .setClassName(classItem.fullName()) .setMethodName(method.name()) .setMethodName(method.name()) for (param in method.parameters()) { for (param in method.parameters()) { api.addParameters(param.type().toTypeString()) api.addParameters(param.type().toTypeString()) } } if (builder.containsFlagToApi(flagValue)) { if (methodFlag != null) { var updatedApis = addFlaggedApi(builder, api, methodFlag) builder .getFlagToApiOrThrow(flagValue) .toBuilder() .addJavaMethods(api) .build() builder.putFlagToApi(flagValue, updatedApis) } else { var apis = FlaggedApis.newBuilder().addJavaMethods(api).build() builder.putFlagToApi(flagValue, apis) } } } } } } } fun addFlaggedApi(builder: FlagApiMap.Builder, api: JavaMethod.Builder, flag: String) { if (builder.containsFlagToApi(flag)) { val updatedApis = builder.getFlagToApiOrThrow(flag).toBuilder().addJavaMethods(api).build() builder.putFlagToApi(flag, updatedApis) } else { val apis = FlaggedApis.newBuilder().addJavaMethods(api).build() builder.putFlagToApi(flag, apis) } } val flagApiMap = builder.build() FileWriter(args[1]).use { it.write(flagApiMap.toString()) } } }