Snippets

Michael Eichberg [OPAL - 1.1.0] Getting information about the usage of fields

Created by Michael Eichberg

File FieldUsage.scala Added

  • Ignore whitespace
  • Hide word diff
+import org.opalj.collection.immutable._; import org.opalj.br._ ; import org.opalj.br.analyses._; import org.opalj.br.instructions._; import org.opalj.collection.immutable.ConstArray.find; import org.opalj.util.PerformanceEvaluation.time
+//val p = Project(org.opalj.bytecode.RTJar)
+ val p = Project(org.opalj.bytecode.JRELibraryFolder)
+p.allFields.size
+p.allFields.count(_.isFinal)
+p.allFields.count(_.isStatic)
+p.allFields.count(f => f.isStatic && f.isFinal)
+
+
+val fieldAccesses = p.get(FieldAccessInformationKey)
+val nonFinalFields = p.allFields.filter(f => !f.isFinal).toSet
+val finalFields = p.allFields.filter(f => f.isFinal).toSet
+
+// fields which are read multiple times (potentially across multiple methods)
+nonFinalFields.filter{ff => fieldAccesses.allReadAccesses.get(ff).map(_.size).getOrElse(0) > 1 }
+
+// fields which are read multiple times in the same method
+nonFinalFields.filter{ff => 
+  fieldAccesses.allReadAccesses.get(ff).map(_.size).getOrElse(0) > 1 && 
+  fieldAccesses.allReadAccesses(ff).map(_._1).toSet.size < fieldAccesses.allReadAccesses(ff).map(_._1).size 
+}
+
+// fields which are read and written in the same method
+nonFinalFields.filter{ff => 
+  fieldAccesses.allReadAccesses.get(ff).toSeq.flatMap(_.map(_._1)).toSet.intersect( 
+    fieldAccesses.allWriteAccesses.get(ff).toSeq.flatMap(_.map(_._1)).toSet
+  ).size > 0
+}.size
HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.