Rozszerzanie listy automatycznych importów w Groovy

Jedną z różnic pomiędzy językami Javy i Groovy jest zbiór automatycznie dostępnych pakietów i klas. W przypadku języka Javą to tylko elementy z pakietu

  • java.lang.*

oraz pakiet bieżący. W Groovy automatycznie importowane są następujące klasy i pakiety

  • java.io.*
  • java.lang.*
  • java.math.BigDecimal
  • java.math.BigInteger
  • java.net.*
  • java.util.*
  • groovy.lang.*
  • groovy.util.*

Co więcej, od wersji 1.8 zbiór ten można łatwo rozszerzyć korzystając z Compilation customizers.

import org.codehaus.groovy.control.customizers.ImportCustomizer
import org.codehaus.groovy.control.CompilerConfiguration

def importCustomizer = new ImportCustomizer()
// package import
importCustomizer.addStarImports('java.util.concurrent')
// static star imports
importCustomizer.addStaticStar('java.lang.Math')
def configuration = new CompilerConfiguration()
configuration.addCompilationCustomizers(importCustomizer)
def shell = new GroovyShell(configuration)
shell.evaluate """
  TimeUnit.SECONDS.toMillis(1);
"""

A co z groovy.ui.Console? Jeśli przyjrzymy się źródłom tej klasy, to okaże się że nie istnieje możliwość przekazania własnych ustawień kompilatora. W teorii wystarczyłoby napisać rozszerzenie klasy groovy.ui.Console

import groovy.ui.Console
import groovy.lang.Binding;
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer
import org.codehaus.groovy.control.customizers.ImportCustomizer
import org.codehaus.groovy.runtime.*

import javax.swing.*

class ConsoleExt extends Console {

	ConsoleExt() {
		this(new Binding())
	}

	ConsoleExt(Binding binding) {
		this(null, binding)
	}

	ConsoleExt(ClassLoader parent) {
		this(parent, new Binding())
	}

	ConsoleExt(ClassLoader parent, Binding binding) {
		super(parent, binding)
	}

	void newScript(ClassLoader parent, Binding binding) {
		def importCustomizer = new ImportCustomizer()
		// package import
		importCustomizer.addStarImports('java.util.concurrent')
		// static star imports
		importCustomizer.addStaticStar('java.lang.Math')
		config =  new CompilerConfiguration()
		config.addCompilationCustomizers(importCustomizer)
		if (threadInterrupt) config.addCompilationCustomizers(
			new ASTTransformationCustomizer(ThreadInterrupt))
		shell = new GroovyShell(parent, binding, config)
	}
}

Niestety, w chwili obecnej takie rozwiązanie nie zadziała ze względu na błąd GROOVY-4670.
Uwaga.
Błąd GROOVY-4670 został naprawiony w wersji 2.1.0-rc-1 więc powyższy kod działa już poprawnie.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s