|
Scala example source code file (GenAndroid.scala)
The Scala GenAndroid.scala source code
/* NSC -- new Scala compiler
* Copyright 2005-2011 LAMP/EPFL
* @author Stephane Micheloud
*/
package scala.tools.nsc
package backend.jvm
import ch.epfl.lamp.fjbg._
import symtab.Flags
trait GenAndroid {
self: GenJVM =>
import global._
import icodes._
import opcodes._
/** From the reference documentation of the Android SDK:
* The `Parcelable` interface identifies classes whose instances can be
* written to and restored from a `Parcel`. Classes implementing the
* `Parcelable` interface must also have a static field called `CREATOR`,
* which is an object implementing the `Parcelable.Creator` interface.
*/
private val fieldName = "CREATOR"
private lazy val AndroidParcelableInterface =
try definitions.getClass("android.os.Parcelable")
catch { case _: FatalError => NoSymbol }
private lazy val AndroidCreatorClass =
if (AndroidParcelableInterface == NoSymbol) NoSymbol
else definitions.getClass("android.os.Parcelable$Creator")
def isAndroidParcelableClass(sym: Symbol) =
(AndroidParcelableInterface != NoSymbol) &&
(sym.info.parents contains AndroidParcelableInterface.tpe)
def addCreatorCode(codegen: BytecodeGenerator, block: BasicBlock) {
import codegen._
val fieldSymbol = clasz.symbol.newValue(NoPosition, newTermName(fieldName))
.setFlag(Flags.STATIC | Flags.FINAL)
.setInfo(AndroidCreatorClass.tpe)
val methodSymbol = definitions.getMember(clasz.symbol.companionModule, fieldName)
clasz addField new IField(fieldSymbol)
block emit CALL_METHOD(methodSymbol, Static(false))
block emit STORE_FIELD(fieldSymbol, true)
}
def legacyAddCreatorCode(codegen: BytecodeGenerator, clinit: JExtendedCode) {
import codegen._
val creatorType = javaType(AndroidCreatorClass)
jclass.addNewField(PublicStaticFinal,
fieldName,
creatorType)
val moduleName = javaName(clasz.symbol)+"$"
clinit.emitGETSTATIC(moduleName,
nme.MODULE_INSTANCE_FIELD.toString,
new JObjectType(moduleName))
clinit.emitINVOKEVIRTUAL(moduleName, fieldName,
new JMethodType(creatorType, Array()))
clinit.emitPUTSTATIC(jclass.getName(), fieldName, creatorType)
}
}
Other Scala examples (source code examples)Here is a short list of links related to this Scala GenAndroid.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.