Skip to content

Commit

Permalink
Add type to Expression
Browse files Browse the repository at this point in the history
`Expression` and `ExpressionTemplate` now contains the type
 of the expression.
  • Loading branch information
pontusmelke authored and henriknyman committed Nov 10, 2016
1 parent 3c4226c commit bb3cc80
Show file tree
Hide file tree
Showing 8 changed files with 205 additions and 129 deletions.
145 changes: 92 additions & 53 deletions community/codegen/src/main/java/org/neo4j/codegen/Expression.java
Expand Up @@ -19,11 +19,25 @@
*/ */
package org.neo4j.codegen; package org.neo4j.codegen;


import static org.neo4j.codegen.TypeReference.BOOLEAN;
import static org.neo4j.codegen.TypeReference.DOUBLE;
import static org.neo4j.codegen.TypeReference.INT;
import static org.neo4j.codegen.TypeReference.LONG;
import static org.neo4j.codegen.TypeReference.OBJECT;
import static org.neo4j.codegen.TypeReference.arrayOf;
import static org.neo4j.codegen.TypeReference.typeReference; import static org.neo4j.codegen.TypeReference.typeReference;


public abstract class Expression extends ExpressionTemplate public abstract class Expression extends ExpressionTemplate
{ {
static final Expression SUPER = new Expression() protected Expression( TypeReference type )
{
super( type );
}

public abstract void accept( ExpressionVisitor visitor );


static final Expression SUPER = new Expression( OBJECT )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -32,59 +46,57 @@ public void accept( ExpressionVisitor visitor )
} }
}; };


public abstract void accept( ExpressionVisitor visitor ); public static Expression gt( final Expression lhs, final Expression rhs, TypeReference argType )

public static Expression gt( final Expression lhs, final Expression rhs, TypeReference type )
{ {
return new Expression() return new Expression( BOOLEAN )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
{ {
visitor.gt( lhs, rhs, type ); visitor.gt( lhs, rhs, argType );
} }
}; };
} }


public static Expression gte( final Expression lhs, final Expression rhs, TypeReference type ) public static Expression gte( final Expression lhs, final Expression rhs, TypeReference argType )
{ {
return new Expression() return new Expression( BOOLEAN )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
{ {
visitor.gte( lhs, rhs, type ); visitor.gte( lhs, rhs, argType );
} }
}; };
} }


public static Expression lt( final Expression lhs, final Expression rhs, TypeReference type ) public static Expression lt( final Expression lhs, final Expression rhs, TypeReference argType )
{ {
return new Expression() return new Expression( BOOLEAN )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
{ {
visitor.lt( lhs, rhs, type ); visitor.lt( lhs, rhs, argType );
} }
}; };
} }


public static Expression lte( final Expression lhs, final Expression rhs, TypeReference type ) public static Expression lte( final Expression lhs, final Expression rhs, TypeReference argType )
{ {
return new Expression() return new Expression( BOOLEAN )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
{ {
visitor.lte( lhs, rhs, type ); visitor.lte( lhs, rhs, argType );
} }
}; };
} }


public static Expression and( final Expression lhs, final Expression rhs ) public static Expression and( final Expression lhs, final Expression rhs )
{ {
return new Expression() return new Expression( BOOLEAN )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -96,7 +108,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression or( final Expression lhs, final Expression rhs ) public static Expression or( final Expression lhs, final Expression rhs )
{ {
return new Expression() return new Expression( BOOLEAN )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -106,21 +118,21 @@ public void accept( ExpressionVisitor visitor )
}; };
} }


public static Expression equal( final Expression lhs, final Expression rhs, TypeReference type ) public static Expression equal( final Expression lhs, final Expression rhs, TypeReference argType )
{ {
return new Expression() return new Expression( BOOLEAN )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
{ {
visitor.equal( lhs, rhs, type ); visitor.equal( lhs, rhs, argType );
} }
}; };
} }


public static Expression load( final LocalVariable variable) public static Expression load( final LocalVariable variable )
{ {
return new Expression() return new Expression( variable.type() )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -132,7 +144,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression addInts( final Expression lhs, final Expression rhs ) public static Expression addInts( final Expression lhs, final Expression rhs )
{ {
return new Expression() return new Expression( INT )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -144,7 +156,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression addLongs( final Expression lhs, final Expression rhs ) public static Expression addLongs( final Expression lhs, final Expression rhs )
{ {
return new Expression() return new Expression( LONG )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -156,7 +168,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression addDoubles( final Expression lhs, final Expression rhs ) public static Expression addDoubles( final Expression lhs, final Expression rhs )
{ {
return new Expression() return new Expression( DOUBLE )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -168,7 +180,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression subtractInts( final Expression lhs, final Expression rhs ) public static Expression subtractInts( final Expression lhs, final Expression rhs )
{ {
return new Expression() return new Expression( INT )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -180,7 +192,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression subtractLongs( final Expression lhs, final Expression rhs ) public static Expression subtractLongs( final Expression lhs, final Expression rhs )
{ {
return new Expression() return new Expression( LONG )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -192,7 +204,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression subtractDoubles( final Expression lhs, final Expression rhs ) public static Expression subtractDoubles( final Expression lhs, final Expression rhs )
{ {
return new Expression() return new Expression( DOUBLE )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -204,7 +216,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression multiplyLongs( final Expression lhs, final Expression rhs ) public static Expression multiplyLongs( final Expression lhs, final Expression rhs )
{ {
return new Expression() return new Expression( LONG )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -216,7 +228,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression multiplyDoubles( final Expression lhs, final Expression rhs ) public static Expression multiplyDoubles( final Expression lhs, final Expression rhs )
{ {
return new Expression() return new Expression( DOUBLE )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -228,16 +240,38 @@ public void accept( ExpressionVisitor visitor )


public static Expression constant( final Object value ) public static Expression constant( final Object value )
{ {
if ( !(value == null ||
value instanceof String || TypeReference reference;
value instanceof Long || if ( value == null )
value instanceof Integer || {
value instanceof Double || reference = OBJECT;
value instanceof Boolean) ) }
else if ( value instanceof String )
{
reference = TypeReference.typeReference( String.class );
}
else if ( value instanceof Long )
{
reference = LONG;
}
else if ( value instanceof Integer )
{
reference = INT;
}
else if ( value instanceof Double )
{
reference = DOUBLE;
}
else if ( value instanceof Boolean )
{
reference = BOOLEAN;
}
else
{ {
throw new IllegalArgumentException( "Not a valid constant!" ); throw new IllegalArgumentException( "Not a valid constant!" );
} }
return new Expression()
return new Expression( reference )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -247,22 +281,23 @@ public void accept( ExpressionVisitor visitor )
}; };
} }


public static Expression newArray( TypeReference type, Expression...constants ) //TODO deduce type from constants
public static Expression newArray( TypeReference baseType, Expression... constants )
{ {
return new Expression() return new Expression( arrayOf( baseType ) )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
{ {
visitor.newArray( type, constants ); visitor.newArray( baseType, constants );
} }
}; };
} }


/** get instance field */ /** get instance field */
public static Expression get( final Expression target, final FieldReference field ) public static Expression get( final Expression target, final FieldReference field )
{ {
return new Expression() return new Expression( field.type() )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -275,7 +310,7 @@ public void accept( ExpressionVisitor visitor )
/** get static field */ /** get static field */
public static Expression get( final FieldReference field ) public static Expression get( final FieldReference field )
{ {
return new Expression() return new Expression( field.type() )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -287,7 +322,8 @@ public void accept( ExpressionVisitor visitor )


public static Expression ternaryOnNull( final Expression test, final Expression onTrue, final Expression onFalse ) public static Expression ternaryOnNull( final Expression test, final Expression onTrue, final Expression onFalse )
{ {
return new Expression() TypeReference reference = onTrue.type.equals( onFalse.type ) ? onTrue.type : OBJECT;
return new Expression( reference )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -297,9 +333,11 @@ public void accept( ExpressionVisitor visitor )
}; };
} }


public static Expression ternaryOnNonNull( final Expression test, final Expression onTrue, final Expression onFalse ) public static Expression ternaryOnNonNull( final Expression test, final Expression onTrue,
final Expression onFalse )
{ {
return new Expression() TypeReference reference = onTrue.type.equals( onFalse.type ) ? onTrue.type : OBJECT;
return new Expression( reference )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -311,7 +349,8 @@ public void accept( ExpressionVisitor visitor )


public static Expression ternary( final Expression test, final Expression onTrue, final Expression onFalse ) public static Expression ternary( final Expression test, final Expression onTrue, final Expression onFalse )
{ {
return new Expression() TypeReference reference = onTrue.type.equals( onFalse.type ) ? onTrue.type : OBJECT;
return new Expression( reference )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -324,7 +363,7 @@ public void accept( ExpressionVisitor visitor )
public static Expression invoke( final Expression target, final MethodReference method, public static Expression invoke( final Expression target, final MethodReference method,
final Expression... arguments ) final Expression... arguments )
{ {
return new Expression() return new Expression( method.returns() )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -336,7 +375,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression invoke( final MethodReference method, final Expression... parameters ) public static Expression invoke( final MethodReference method, final Expression... parameters )
{ {
return new Expression() return new Expression( method.returns() )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -353,7 +392,7 @@ public static Expression cast( Class<?> type, Expression expression )


public static Expression cast( final TypeReference type, Expression expression ) public static Expression cast( final TypeReference type, Expression expression )
{ {
return new Expression() return new Expression( type )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -370,7 +409,7 @@ public static Expression newInstance( Class<?> type )


public static Expression newInstance( final TypeReference type ) public static Expression newInstance( final TypeReference type )
{ {
return new Expression() return new Expression( type )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -382,7 +421,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression not( final Expression expression ) public static Expression not( final Expression expression )
{ {
return new Expression() return new Expression( BOOLEAN )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -394,7 +433,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression toDouble( final Expression expression ) public static Expression toDouble( final Expression expression )
{ {
return new Expression() return new Expression( DOUBLE )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand All @@ -406,7 +445,7 @@ public void accept( ExpressionVisitor visitor )


public static Expression pop( Expression expression ) public static Expression pop( Expression expression )
{ {
return new Expression() return new Expression( expression.type )
{ {
@Override @Override
public void accept( ExpressionVisitor visitor ) public void accept( ExpressionVisitor visitor )
Expand Down

0 comments on commit bb3cc80

Please sign in to comment.