Skip to content

Commit

Permalink
Issue highsource#11. Basic setup.
Browse files Browse the repository at this point in the history
  • Loading branch information
ja6a authored and ja6a committed Nov 28, 2014
1 parent 24a2913 commit dcdce1a
Show file tree
Hide file tree
Showing 9 changed files with 219 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ protected void processClassOutline(ClassOutline classOutline) {

protected JMethod generateObject$equals(final ClassOutline classOutline,
final JDefinedClass theClass) {

final JCodeModel codeModel = theClass.owner();
final JMethod objectEquals = theClass.method(JMod.PUBLIC,
codeModel.BOOLEAN, "equals");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator;

import org.apache.commons.lang3.Validate;

import com.sun.codemodel.JCodeModel;

public abstract class BaseHashCodeCodeGenerator implements
HashCodeCodeGenerator {

private final JCodeModel codeModel;

public BaseHashCodeCodeGenerator(JCodeModel codeModel) {
this.codeModel = Validate.notNull(codeModel);
}

public JCodeModel getCodeModel() {
return codeModel;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator;

import org.apache.commons.lang3.Validate;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JOp;
import com.sun.codemodel.JType;

public abstract class BasicHashCodeCodeGenerator implements
HashCodeCodeGenerator {

private final JCodeModel codeModel;

public BasicHashCodeCodeGenerator(JCodeModel codeModel) {
this.codeModel = Validate.notNull(codeModel);
}

@Override
public void generate(JBlock block, JType type, JExpression left,
JExpression right) {
// if (!(left ==null ? right == null : <comparison>))
// { return false; }
final JExpression comparison = comparison(left, right);
block._if(
JOp.cond(left.eq(JExpr._null()), right.eq(JExpr._null()),
comparison).not())._then()._return(JExpr.FALSE);
}

public abstract JExpression comparison(JExpression left,
JExpression right);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator;

import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JExpression;

public class DoubleHashCodeCodeGenerator extends
PrimitiveHashCodeCodeGenerator {
public DoubleHashCodeCodeGenerator(JCodeModel codeModel) {
super(codeModel);
}

@Override
public JExpression transform(JExpression expression) {
return getCodeModel().ref(Double.class)
.staticInvoke("doubleToLongBits").arg(expression);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator;

import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JExpression;

public class FloatHashCodeCodeGenerator extends
PrimitiveHashCodeCodeGenerator {
public FloatHashCodeCodeGenerator(JCodeModel codeModel) {
super(codeModel);
}

@Override
public JExpression transform(JExpression expression) {
return getCodeModel().ref(Float.class)
.staticInvoke("floatToIntBits").arg(expression);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator;

import org.jvnet.jaxb2_commons.codemodel.generator.CodeGenerator;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JType;

public interface HashCodeCodeGenerator extends CodeGenerator {

public void generate(JBlock block, JType type, JExpression left,
JExpression right);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang3.Validate;
import org.jvnet.jaxb2_commons.codemodel.JCMType;
import org.jvnet.jaxb2_commons.codemodel.JCMTypeFactory;
import org.jvnet.jaxb2_commons.codemodel.generator.TypedCodeGeneratorFactory;

import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JType;

public class HashCodeCodeGeneratorFactory implements
TypedCodeGeneratorFactory<HashCodeCodeGenerator> {

private final JCodeModel codeModel;
private final JCMTypeFactory typeFactory = new JCMTypeFactory();
// Known code generators
private final Map<JCMType<?>, HashCodeCodeGenerator> codeGenerators = new LinkedHashMap<JCMType<?>, HashCodeCodeGenerator>();

public HashCodeCodeGeneratorFactory(JCodeModel codeModel) {

this.codeModel = Validate.notNull(codeModel);
addCodeGenerator(this.codeModel.BOOLEAN,
new PrimitiveHashCodeCodeGenerator(this.codeModel));
addCodeGenerator(this.codeModel.BYTE, new PrimitiveHashCodeCodeGenerator(
this.codeModel));
addCodeGenerator(this.codeModel.SHORT,
new PrimitiveHashCodeCodeGenerator(this.codeModel));
addCodeGenerator(this.codeModel.CHAR, new PrimitiveHashCodeCodeGenerator(
this.codeModel));
addCodeGenerator(this.codeModel.INT, new PrimitiveHashCodeCodeGenerator(
this.codeModel));
addCodeGenerator(this.codeModel.FLOAT, new FloatHashCodeCodeGenerator(
this.codeModel));
addCodeGenerator(this.codeModel.LONG, new PrimitiveHashCodeCodeGenerator(
this.codeModel));
addCodeGenerator(this.codeModel.DOUBLE, new FloatHashCodeCodeGenerator(
this.codeModel));
// TODO primitive arrays
// TODO Collections/Lists
// TODO JAXBElement
addCodeGenerator(this.codeModel.ref(Object.class),
new ObjectHashCodeCodeGenerator(this.codeModel));
}

private void addCodeGenerator(final JType type,
HashCodeCodeGenerator hashCodeCodeGenerator) {
final JCMType<?> factoredType = typeFactory.create(type);
this.codeGenerators.put(factoredType, hashCodeCodeGenerator);
}

@Override
public HashCodeCodeGenerator getCodeGenerator(JType type) {
final JCMType<JType> factoredType = typeFactory.create(type);
for (Entry<JCMType<?>, HashCodeCodeGenerator> entry : codeGenerators
.entrySet()) {
if (entry.getKey().matches(factoredType)) {
return entry.getValue();
}
}
throw new IllegalArgumentException(
"Could not find a code generator for [" + type + "].");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator;

import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JExpression;

public class ObjectHashCodeCodeGenerator extends
BasicHashCodeCodeGenerator {

public ObjectHashCodeCodeGenerator(JCodeModel codeModel) {
super(codeModel);
}

@Override
public JExpression comparison(JExpression left, JExpression right) {
// left.hashCode(right)
return left.invoke("hashCode").arg(right);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JType;

public class PrimitiveHashCodeCodeGenerator extends
BaseHashCodeCodeGenerator {

public PrimitiveHashCodeCodeGenerator(JCodeModel codeModel) {
super(codeModel);
}

@Override
public void generate(JBlock block, JType type, JExpression left,
JExpression right) {
// if (!(left ==null ? right == null : <comparison>))
// { return false; }
final JExpression comparison = comparison(left, right);
block._if(comparison.not())._then()._return(JExpr.FALSE);
}

public JExpression comparison(JExpression left, JExpression right) {
return transform(left).eq(transform(right));
}

public JExpression transform(JExpression expression) {
return expression;
}
}

0 comments on commit dcdce1a

Please sign in to comment.