package cbt package proguard import java.io.File import java.nio.file.Files.deleteIfExists sealed class KeepOptionModifier( val string: String ) object KeepOptionModifier { /* AUTO GENERATED SECTION BEGIN: keepModifiers */ /** Also keep any classes in the descriptors of specified fields and methods. */ object includedescriptorclasses extends KeepOptionModifier( "includedescriptorclasses" ) /** Allow the specified entry points to be removed in the shrinking step. */ object allowshrinking extends KeepOptionModifier( "allowshrinking" ) /** Allow the specified entry points to be modified in the optimization step. */ object allowoptimization extends KeepOptionModifier( "allowoptimization" ) /** Allow the specified entry points to be renamed in the obfuscation step. */ object allowobfuscation extends KeepOptionModifier( "allowobfuscation" ) /* AUTO GENERATED SECTION END: keepModifiers */ } object ProGuard { val artifactId = "proguard-base" val groupId = "net.sf.proguard" val version = "5.3.2" val mainClass = "proguard.ProGuard" val `rt.jar` = Seq( new File( System.getProperty( "java.home" ), "lib/rt.jar" ) ) } case class ProGuard[T]( main: Seq[String] => Int, T: Seq[File] => T, log: String => Unit = _ => () ) { /** Typed interface on top of the proguard command line tool. Check the official ProGuard docs for usage. Use `Some( None )` to call an option without arguments. Use `true` to set a flag. @see https://www.guardsquare.com/en/proguard/manual/refcard @see https://www.guardsquare.com/en/proguard/manual/usage /* AUTO GENERATED SECTION BEGIN: docs */ @param include Read configuration options from the given file. @param basedirectory Specifies the base directory for subsequent relative file names. @param injars Specifies the program jars ( or wars, ears, zips, or directories ). @param outjars Specifies the names of the output jars ( or wars, ears, zips, or directories ). @param libraryjars Specifies the library jars ( or wars, ears, zips, or directories ). @param skipnonpubliclibraryclasses Ignore non-public library classes. @param dontskipnonpubliclibraryclasses Don't ignore non-public library classes ( the default ). @param dontskipnonpubliclibraryclassmembers Don't ignore package visible library class members. @param keepdirectories Keep the specified directories in the output jars ( or wars, ears, zips, or directories ). @param target Set the given version number in the processed classes. @param forceprocessing Process the input, even if the output seems up to date. @param keep Preserve the specified classes and class members. @param keepclassmembers Preserve the specified class members, if their classes are preserved as well. @param keepclasseswithmembers Preserve the specified classes and class members, if all of the specified class members are present. @param keepnames Preserve the names of the specified classes and class members ( if they aren't removed in the shrinking step ). @param keepclassmembernames Preserve the names of the specified class members ( if they aren't removed in the shrinking step ). @param keepclasseswithmembernames Preserve the names of the specified classes and class members, if all of the specified class members are present ( after the shrinking step ). @param printseeds List classes and class members matched by the various -keep options, to the standard output or to the given file. @param dontshrink Don't shrink the input class files. @param printusage List dead code of the input class files, to the standard output or to the given file. @param whyareyoukeeping Print details on why the given classes and class members are being kept in the shrinking step. @param dontoptimize Don't optimize the input class files. @param optimizations The optimizations to be enabled and disabled. @param optimizationpasses The number of optimization passes to be performed. @param assumenosideeffects Assume that the specified methods don't have any side effects, while optimizing. @param allowaccessmodification Allow the access modifiers of classes and class members to be modified, while optimizing. @param mergeinterfacesaggressively Allow any interfaces to be merged, while optimizing. @param dontobfuscate Don't obfuscate the input class files. @param printmapping Print the mapping from old names to new names for classes and class members that have been renamed, to the standard output or to the given file. @param applymapping Reuse the given mapping, for incremental obfuscation. @param obfuscationdictionary Use the words in the given text file as obfuscated field names and method names. @param classobfuscationdictionary Use the words in the given text file as obfuscated class names. @param packageobfuscationdictionary Use the words in the given text file as obfuscated package names. @param overloadaggressively Apply aggressive overloading while obfuscating. @param useuniqueclassmembernames Ensure uniform obfuscated class member names for subsequent incremental obfuscation. @param dontusemixedcaseclassnames Don't generate mixed-case class names while obfuscating. @param keeppackagenames Keep the specified package names from being obfuscated. @param flattenpackagehierarchy Repackage all packages that are renamed into the single given parent package. @param repackageclasses Repackage all class files that are renamed into the single given package. @param keepattributes Preserve the given optional attributes; typically Exceptions, InnerClasses, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable, LocalVariableTypeTable, Synthetic, EnclosingMethod, and *Annotation*. @param keepparameternames Keep the parameter names and types of methods that are kept. @param renamesourcefileattribute Put the given constant string in the SourceFile attributes. @param adaptclassstrings Adapt string constants in the specified classes, based on the obfuscated names of any corresponding classes. @param adaptresourcefilenames Rename the specified resource files, based on the obfuscated names of the corresponding class files. @param adaptresourcefilecontents Update the contents of the specified resource files, based on the obfuscated names of the processed classes. @param dontpreverify Don't preverify the processed class files. @param microedition Target the processed class files at Java Micro Edition. @param verbose Write out some more information during processing. @param dontnote Don't print notes about potential mistakes or omissions in the configuration. @param dontwarn Don't warn about unresolved references at all. @param ignorewarnings Print warnings about unresolved references, but continue processing anyhow. @param printconfiguration Write out the entire configuration in traditional ProGuard style, to the standard output or to the given file. @param dump Write out the internal structure of the processed class files, to the standard output or to the given file. /* AUTO GENERATED SECTION END: docs */ */ case class proguard( /* AUTO GENERATED SECTION BEGIN: params */ include: Option[File] = None, basedirectory: Option[File] = None, injars: Option[Seq[File]] = None, outjars: Option[Seq[File]] = None, libraryjars: Option[Seq[File]] = None, skipnonpubliclibraryclasses: Boolean = false, dontskipnonpubliclibraryclasses: Boolean = false, dontskipnonpubliclibraryclassmembers: Boolean = false, keepdirectories: Option[Option[String]] = None, target: Option[String] = None, forceprocessing: Boolean = false, keep: Option[( Seq[KeepOptionModifier], String )] = None, keepclassmembers: Option[( Seq[KeepOptionModifier], String )] = None, keepclasseswithmembers: Option[( Seq[KeepOptionModifier], String )] = None, keepnames: Option[String] = None, keepclassmembernames: Option[String] = None, keepclasseswithmembernames: Option[String] = None, printseeds: Option[Option[File]] = None, dontshrink: Boolean = false, printusage: Option[Option[File]] = None, whyareyoukeeping: Option[String] = None, dontoptimize: Boolean = false, optimizations: Option[String] = None, optimizationpasses: Option[Int] = None, assumenosideeffects: Option[String] = None, allowaccessmodification: Boolean = false, mergeinterfacesaggressively: Boolean = false, dontobfuscate: Boolean = false, printmapping: Option[Option[File]] = None, applymapping: Option[File] = None, obfuscationdictionary: Option[File] = None, classobfuscationdictionary: Option[File] = None, packageobfuscationdictionary: Option[File] = None, overloadaggressively: Boolean = false, useuniqueclassmembernames: Boolean = false, dontusemixedcaseclassnames: Boolean = false, keeppackagenames: Option[Option[String]] = None, flattenpackagehierarchy: Option[Option[String]] = None, repackageclasses: Option[Option[String]] = None, keepattributes: Option[Option[String]] = None, keepparameternames: Boolean = false, renamesourcefileattribute: Option[Option[String]] = None, adaptclassstrings: Option[Option[String]] = None, adaptresourcefilenames: Option[Option[String]] = None, adaptresourcefilecontents: Option[Option[String]] = None, dontpreverify: Boolean = false, microedition: Boolean = false, verbose: Boolean = false, dontnote: Option[Option[String]] = None, dontwarn: Option[Option[String]] = None, ignorewarnings: Boolean = false, printconfiguration: Option[Option[File]] = None, dump: Option[Option[File]] = None /* AUTO GENERATED SECTION END: params */ ) extends ( () => T ) { // type class rendering scala values into string arguments private class argsFor[T]( val apply: T => Option[Seq[String]] ) private object argsFor { def apply[T: argsFor]( value: T ) = implicitly[argsFor[T]].apply( value ) implicit object SeqFile extends argsFor[Seq[File]]( v => Some( Seq( v.map( _.getPath ).mkString( ":" ) ) ) ) implicit object File extends argsFor[File]( v => Some( Seq( v.getPath ) ) ) implicit object String extends argsFor[String]( v => Some( Seq( v ) ) ) implicit object Int extends argsFor[Int]( i => Some( Seq( i.toString ) ) ) implicit object Boolean extends argsFor[Boolean]( { case false => None case true => Some( Nil ) } ) implicit def Option2[T: argsFor]: argsFor[Option[T]] = new argsFor( _.map( implicitly[argsFor[T]].apply( _ ).toSeq.flatten ) ) implicit def Option3[T: argsFor]: argsFor[Option[Option[String]]] = new argsFor( _.map( _.toSeq ) ) implicit def SpecWithModifiers: argsFor[( Seq[KeepOptionModifier], String )] = new argsFor( { case ( modifiers, spec ) => Some( Seq( modifiers.map( _.string ).map( "," ++ _ ).mkString ).filterNot( _ == "" ) :+ spec ) } ) } // capture string argument values and names val args = ( /* AUTO GENERATED SECTION BEGIN: args */ argsFor( include ).map( "-include" +: _ ) ++ argsFor( basedirectory ).map( "-basedirectory" +: _ ) ++ argsFor( injars ).map( "-injars" +: _ ) ++ argsFor( outjars ).map( "-outjars" +: _ ) ++ argsFor( libraryjars ).map( "-libraryjars" +: _ ) ++ argsFor( skipnonpubliclibraryclasses ).map( "-skipnonpubliclibraryclasses" +: _ ) ++ argsFor( dontskipnonpubliclibraryclasses ).map( "-dontskipnonpubliclibraryclasses" +: _ ) ++ argsFor( dontskipnonpubliclibraryclassmembers ).map( "-dontskipnonpubliclibraryclassmembers" +: _ ) ++ argsFor( keepdirectories ).map( "-keepdirectories" +: _ ) ++ argsFor( target ).map( "-target" +: _ ) ++ argsFor( forceprocessing ).map( "-forceprocessing" +: _ ) ++ argsFor( keep ).map( "-keep" +: _ ) ++ argsFor( keepclassmembers ).map( "-keepclassmembers" +: _ ) ++ argsFor( keepclasseswithmembers ).map( "-keepclasseswithmembers" +: _ ) ++ argsFor( keepnames ).map( "-keepnames" +: _ ) ++ argsFor( keepclassmembernames ).map( "-keepclassmembernames" +: _ ) ++ argsFor( keepclasseswithmembernames ).map( "-keepclasseswithmembernames" +: _ ) ++ argsFor( printseeds ).map( "-printseeds" +: _ ) ++ argsFor( dontshrink ).map( "-dontshrink" +: _ ) ++ argsFor( printusage ).map( "-printusage" +: _ ) ++ argsFor( whyareyoukeeping ).map( "-whyareyoukeeping" +: _ ) ++ argsFor( dontoptimize ).map( "-dontoptimize" +: _ ) ++ argsFor( optimizations ).map( "-optimizations" +: _ ) ++ argsFor( optimizationpasses ).map( "-optimizationpasses" +: _ ) ++ argsFor( assumenosideeffects ).map( "-assumenosideeffects" +: _ ) ++ argsFor( allowaccessmodification ).map( "-allowaccessmodification" +: _ ) ++ argsFor( mergeinterfacesaggressively ).map( "-mergeinterfacesaggressively" +: _ ) ++ argsFor( dontobfuscate ).map( "-dontobfuscate" +: _ ) ++ argsFor( printmapping ).map( "-printmapping" +: _ ) ++ argsFor( applymapping ).map( "-applymapping" +: _ ) ++ argsFor( obfuscationdictionary ).map( "-obfuscationdictionary" +: _ ) ++ argsFor( classobfuscationdictionary ).map( "-classobfuscationdictionary" +: _ ) ++ argsFor( packageobfuscationdictionary ).map( "-packageobfuscationdictionary" +: _ ) ++ argsFor( overloadaggressively ).map( "-overloadaggressively" +: _ ) ++ argsFor( useuniqueclassmembernames ).map( "-useuniqueclassmembernames" +: _ ) ++ argsFor( dontusemixedcaseclassnames ).map( "-dontusemixedcaseclassnames" +: _ ) ++ argsFor( keeppackagenames ).map( "-keeppackagenames" +: _ ) ++ argsFor( flattenpackagehierarchy ).map( "-flattenpackagehierarchy" +: _ ) ++ argsFor( repackageclasses ).map( "-repackageclasses" +: _ ) ++ argsFor( keepattributes ).map( "-keepattributes" +: _ ) ++ argsFor( keepparameternames ).map( "-keepparameternames" +: _ ) ++ argsFor( renamesourcefileattribute ).map( "-renamesourcefileattribute" +: _ ) ++ argsFor( adaptclassstrings ).map( "-adaptclassstrings" +: _ ) ++ argsFor( adaptresourcefilenames ).map( "-adaptresourcefilenames" +: _ ) ++ argsFor( adaptresourcefilecontents ).map( "-adaptresourcefilecontents" +: _ ) ++ argsFor( dontpreverify ).map( "-dontpreverify" +: _ ) ++ argsFor( microedition ).map( "-microedition" +: _ ) ++ argsFor( verbose ).map( "-verbose" +: _ ) ++ argsFor( dontnote ).map( "-dontnote" +: _ ) ++ argsFor( dontwarn ).map( "-dontwarn" +: _ ) ++ argsFor( ignorewarnings ).map( "-ignorewarnings" +: _ ) ++ argsFor( printconfiguration ).map( "-printconfiguration" +: _ ) ++ argsFor( dump ).map( "-dump" +: _ ) /* AUTO GENERATED SECTION END: args */ ).flatten.toSeq def apply: T = { outjars.foreach( _.map( _.toPath ).map( deleteIfExists ) ) val c = main( args ) if ( c != 0 ) throw new Exception T( outjars.toSeq.flatten ) } } }