Eric Milles created GROOVY-8222:
-----------------------------------

             Summary: AsmClassGenerator does not set source positions on 
property expressions
                 Key: GROOVY-8222
                 URL: https://issues.apache.org/jira/browse/GROOVY-8222
             Project: Groovy
          Issue Type: Bug
            Reporter: Eric Milles


AsmClassGenerator.visitVariableExpression and 
AsmClassGenerator.processClassVariable can create a new PropertyExpression from 
a VariableExpression and the source position of the original is not transferred.

Solution is pretty minimal:
{code} // mid way through visitVariableExpression:
        if (variable == null) {
            // GRECLIPSE edit
            //processClassVariable(variableName);
            processClassVariable(expression);
            // GRECLIPSE end
        } else {
{code}

{code}
    // GRECLIPSE edit
    //private void processClassVariable(String name) {
    private void processClassVariable(VariableExpression expression) {
        String name = expression.getName();
    // GRECLIPSE end
{code}

{code} // end of processClassVariable:
        } else {
            // GRECLIPSE edit
            //PropertyExpression pexp = new 
PropertyExpression(VariableExpression.THIS_EXPRESSION, name);
            PropertyExpression pexp = new PropertyExpression(new 
VariableExpression("this", ClassHelper.DYNAMIC_TYPE), name);
            pexp.getObjectExpression().setSourcePosition(expression);
            pexp.getProperty().setSourcePosition(expression);
            // GRECLIPSE end
            pexp.setImplicitThis(true);
            visitPropertyExpression(pexp);
        }
{code}


I found this because I had a {{with}} expression that produced an error that 
was attributed to line -1.
{code}
import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jsonorg.JsonOrgModule
import org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean
@groovy.transform.CompileStatic
final class CustomObjectMapper extends ObjectMapper
{
    CustomObjectMapper()
    {
        super(mimicSpring())
    }

    private static ObjectMapper mimicSpring()
    {
        /* Formerly in SpringDispatcherContext.xml:
         *  <bean 
class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
         *    
p:modulesToInstall="com.fasterxml.jackson.datatype.jsonorg.JsonOrgModule"
         *    p:serializationInclusion="NON_NULL" 
p:failOnUnknownProperties="false"
         *    p:autoDetectFields="false" p:autoDetectGettersSetters="true">
         *  </bean>
         */

        new Jackson2ObjectMapperFactoryBean().with {
            modulesToInstall = JsonOrgModule // Joda module is auto-discovered
            serializationInclusion = JsonInclude.Include.NON_NULL
            defaultViewInclusion = true // include w/o view tag
            failOnUnknownProperties = false
            autoDetectGettersSetters = true
            autoDetectFields = false
            afterPropertiesSet()
            return object // error on this line; this.object is the 
PropertyExpression that is created by AsmClassGenerator
        }
    }
}
{code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to