Skip to content

Instantly share code, notes, and snippets.

@eunjae-lee
Created June 4, 2014 14:23
Show Gist options
  • Save eunjae-lee/df3ee7cd54af4c1fd6bc to your computer and use it in GitHub Desktop.
Save eunjae-lee/df3ee7cd54af4c1fd6bc to your computer and use it in GitHub Desktop.
Android - parcelable model class generator
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<title>parcelable</title>
</head>
<body>
<input type="text" id="className" placeholder="className" value="" />
<textarea id="textarea" style="width:600px; height:400px;"></textarea>
<input type="button" id="button" value="generate!" />
<br/><br/><br/><br/>
result :
<textarea id="result" style="width:600px; height:500px;"></textarea>
<script type="text/coffeescript">
capitalize = (name) ->
name[0].toUpperCase() + name[1..-1]
class Var
constructor: (@type, @name) ->
writeToParcel: ->
readSource: ->
getterSetter: ->
getterName = "get#{capitalize(@name)}"
setterName = "set#{capitalize(@name)}"
if @type in ["boolean", "Boolean"]
getterName = "is#{capitalize(@name)}"
writeln """public #{@type} #{getterName}() {
return #{@name};
}
public void #{setterName}(#{@type} #{@name}) {
this.#{@name} = #{@name};
}\n
"""
class PrimitiveVar extends Var
writeToParcel: ->
if @type is "boolean" or @type is "Boolean"
writeln " dest.writeByte((byte) (#{@name} ? 1 : 0));"
else
writeln " dest.write#{capitalize(@type)}(#{@name});"
readSource: ->
if @type is "boolean" or @type is "Boolean"
writeln " #{@name} = src.readByte() == 1;"
else
writeln " #{@name} = src.read#{capitalize(@type)}();"
class ObjectVar extends Var
writeToParcel: ->
writeln """ dest.writeByte((byte) (#{@name} != null ? 1 : 0));
\tif (#{@name} != null) {
\t #{@name}.writeToParcel(dest, flags);
\t}"""
readSource: ->
writeln """ if (src.readByte() == 1) {
\t #{@name} = new #{@type}(src);
\t}"""
class ArrayListVar extends Var
constructor: (@type, @name) ->
@realType = @type.split("ArrayList<")[1]
@realType = @realType.substr 0, @realType.length - 1
writeToParcel: ->
writeln """\tdest.writeInt(#{@name} != null ? #{@name}.size() : 0);
\tif (#{@name} != null) {
\t for (#{@realType} _item : #{@name}) {
\t _item.writeToParcel(dest, flags);
\t }
\t}
"""
readSource: ->
writeln """\tint #{@name}Count = src.readInt();
\tif (#{@name}Count > 0) {
\t #{@name} = new ArrayList<#{@realType}>();
\t for (int i = 0; i < #{@name}Count; i++) {
\t #{@name}.add(new #{@realType}(src));
\t }
\t}
"""
createVar = (type, name) ->
if type in ["String", "int", "long", "boolean", "Boolean", "float", "double"]
return new PrimitiveVar(type, name)
else if type.indexOf("ArrayList<") is 0
return new ArrayListVar(type, name)
else
return new ObjectVar(type, name)
write = (content) ->
$("#result").val($("#result").val() + content)
writeln = (content) ->
write "#{content}\n"
writeConstructors = (className) ->
content = """public #{className}() {
}
public #{className}(Parcel in) {
readSource(in);
}
@Override
public int describeContents() {
return 0;
}
"""
writeln content
writeToParcel = (vars) ->
writeln """@Override
public void writeToParcel(Parcel dest, int flags) {
"""
for variable in vars
variable.writeToParcel()
writeln "}\n"
readSource = (vars) ->
writeln """private void readSource(Parcel src) {
\tif (src == null) {
\t return;
\t}
"""
for variable in vars
variable.readSource()
writeln "}\n"
getterSetter = (vars) ->
for variable in vars
variable.getterSetter()
writeCreator = (className) ->
writeln """public static final Parcelable.Creator<#{className}> CREATOR = new Parcelable.Creator<#{className}>() {
@Override
public #{className} createFromParcel(Parcel source) {
return new #{className}(source);
}
@Override
public #{className}[] newArray(int size) {
return new #{className}[size];
}
};"""
$(document).ready ->
$("#button").click ->
$("#result").val("")
className = $("#className").val()
vars = []
for line in $("#textarea").val().split("\n")
line = line.trim()
if line.split(" ")[0] in ["public", "private", "protected"]
line = line.split(" ")[1..-1].join(" ")
if line.indexOf("=") > 0
line = line.split("=")[0].trim()
if line.indexOf(";") > 0
line = line.split(";")[0].trim()
console.log line
[type, name] = line.split(" ")
vars.push createVar(type, name)
writeConstructors(className)
writeToParcel(vars)
readSource(vars)
getterSetter(vars)
writeCreator(className);
</script>
<script type="text/javascript" src="http://coffeescript.org/extras/coffee-script.js"></script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment