All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mysema.scalagen.VarToVal.scala Maven / Gradle / Ivy

There is a newer version: 1.0.2
Show newest version
/*
 * Copyright (C) 2011, Mysema Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.mysema.scalagen

import java.util.ArrayList
import japa.parser.ast.CompilationUnit
import UnitTransformer._
import defs._
import japa.parser.ast.body.ModifierSet

object VarToVal extends VarToVal

object defs {
  type Vars = List[Map[String,VariableDeclaration]]
}

/**
 * VarToVal changes var to val if no reassignments are done 
 */
class VarToVal extends ModifierVisitor[Vars] with UnitTransformer {
  
  private val operators = Set(Unary.posDecrement, Unary.posIncrement,
      Unary.preDecrement, Unary.preIncrement)
  
  def transform(cu: CompilationUnit): CompilationUnit = {
    cu.accept(this, Nil).asInstanceOf[CompilationUnit] 
  }  
  
  override def visit(n: Block, arg: Vars): Node = {      
    if (n.getStmts == null) {
      return n
    }
    val vars = n.getStmts.collect { case Stmt(v: VariableDeclaration) => v }
      .flatMap(v => v.getVars.map(va => (va.getId.getName,v)))
      .toMap    
    // set vars to final
    vars.values.foreach(_.addModifier(ModifierSet.FINAL))    
    super.visit(n,  vars :: arg)
  }
  
  override def visit(n: Assign, arg: Vars): Node = {
    removeFinal(n.getTarget.toString, arg)
    n
  }
  
  override def visit(n: Unary, arg: Vars): Node = {
    if (operators.contains(n.getOperator)) {
      removeFinal(n.getExpr.toString, arg) 
    } 
    n
  }
  
  // leave VariableDeclarations unchanged
  override def visit(n: VariableDeclaration, arg: Vars): Node = n
    
  private def removeFinal(key: String, arg: Vars) {
    arg.find(_.contains(key))        
      .flatMap(_.get(key))
      .foreach(_.removeModifier(ModifierSet.FINAL))    
  }
  
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy