Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
def sameMethodAndFieldSignatures compares two classes to verify they have all the same methods and fields, and no others.
- Loading branch information
Showing
2 changed files
with
90 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,60 @@ | |||
package scala.tools.partest | |||
|
|||
import scala.collection.JavaConverters._ | |||
import scala.tools.asm | |||
import asm._ | |||
import asm.tree._ | |||
import java.lang.reflect.Modifier | |||
|
|||
sealed trait AsmNode[+T] { | |||
def node: T | |||
def access: Int | |||
def desc: String | |||
def name: String | |||
def signature: String | |||
def attrs: List[Attribute] | |||
def visibleAnnotations: List[AnnotationNode] | |||
def invisibleAnnotations: List[AnnotationNode] | |||
def characteristics = f"$name%15s $desc%-30s$accessString$sigString" | |||
|
|||
private def accessString = if (access == 0) "" else " " + Modifier.toString(access) | |||
private def sigString = if (signature == null) "" else " " + signature | |||
override def toString = characteristics | |||
} | |||
|
|||
object AsmNode { | |||
type AsmMethod = AsmNode[MethodNode] | |||
type AsmField = AsmNode[FieldNode] | |||
type AsmMember = AsmNode[_] | |||
|
|||
implicit class ClassNodeOps(val node: ClassNode) { | |||
def fieldsAndMethods: List[AsmMember] = { | |||
val xs: List[AsmMember] = ( | |||
node.methods.asScala.toList.map(x => (x: AsmMethod)) | |||
++ node.fields.asScala.toList.map(x => (x: AsmField)) | |||
) | |||
xs sortBy (_.characteristics) | |||
} | |||
} | |||
implicit class AsmMethodNode(val node: MethodNode) extends AsmNode[MethodNode] { | |||
def access: Int = node.access | |||
def desc: String = node.desc | |||
def name: String = node.name | |||
def signature: String = node.signature | |||
def attrs: List[Attribute] = node.attrs.asScala.toList | |||
def visibleAnnotations: List[AnnotationNode] = node.visibleAnnotations.asScala.toList | |||
def invisibleAnnotations: List[AnnotationNode] = node.invisibleAnnotations.asScala.toList | |||
} | |||
implicit class AsmFieldNode(val node: FieldNode) extends AsmNode[FieldNode] { | |||
def access: Int = node.access | |||
def desc: String = node.desc | |||
def name: String = node.name | |||
def signature: String = node.signature | |||
def attrs: List[Attribute] = node.attrs.asScala.toList | |||
def visibleAnnotations: List[AnnotationNode] = node.visibleAnnotations.asScala.toList | |||
def invisibleAnnotations: List[AnnotationNode] = node.invisibleAnnotations.asScala.toList | |||
} | |||
|
|||
def apply(node: MethodNode): AsmMethodNode = new AsmMethodNode(node) | |||
def apply(node: FieldNode): AsmFieldNode = new AsmFieldNode(node) | |||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters