Skip to content

Instantly share code, notes, and snippets.

@quintesse
Created October 25, 2016 18:11
Show Gist options
  • Save quintesse/004e33e84553abd75412ceb3d164bf4a to your computer and use it in GitHub Desktop.
Save quintesse/004e33e84553abd75412ceb3d164bf4a to your computer and use it in GitHub Desktop.
Self-typechecking Ceylon program
native("jvm")
module selftypecheck "1.0.0" {
import ceylon.interop.java "1.3.1-SNAPSHOT";
import com.redhat.ceylon.typechecker "1.3.1-SNAPSHOT";
import com.redhat.ceylon.compiler.java "1.3.1-SNAPSHOT";
}
import java.io{File}
import java.util.concurrent{JCallable=Callable}
import ceylon.interop.java{JavaList}
import com.redhat.ceylon.cmr.api{RepositoryManager}
import com.redhat.ceylon.cmr.ceylon{CeylonUtils}
import com.redhat.ceylon.compiler.typechecker{TypeCheckerBuilder, TypeChecker}
import com.redhat.ceylon.compiler.typechecker.io.cmr.impl{LeakingLogger}
import com.redhat.ceylon.compiler.typechecker.util {ModuleManagerFactory}
import com.redhat.ceylon.model.typechecker.util {ModuleManager}
import com.redhat.ceylon.compiler.typechecker.context {Context,PhasedUnits}
import com.redhat.ceylon.compiler.typechecker.analyzer {ModuleSourceMapper}
import com.redhat.ceylon.compiler {PhasedUnitsModuleManager}
import com.redhat.ceylon.compiler.java.loader.model {LazyModuleSourceMapper}
import com.redhat.ceylon.common {ModuleSpec}
import com.redhat.ceylon.model.loader.model {LazyModuleManager}
late TypeChecker typeChecker;
shared void run(){
value args = ["/home/ceylon/ceylon/ceylon-eclipse-workspace/selftypecheck/source"];
RepositoryManager repositoryManager =
CeylonUtils.repoManager()
.systemRepo("/home/ceylon/ceylon/ceylon/dist/dist/repo")
.logger(LeakingLogger())
.buildManager();
value outputRepositoryManager = repositoryManager;
TypeCheckerBuilder tcb =
TypeCheckerBuilder()
.setRepositoryManager(repositoryManager)
.verbose(true)
.statistics(true);
value getTypechecker = object satisfies JCallable<PhasedUnits> {
shared actual PhasedUnits call() => typeChecker.phasedUnits;
};
value modules = JavaList([ModuleSpec("selftypecheck", "1.0.0")]);
value mmf = object satisfies ModuleManagerFactory {
shared actual ModuleManager createModuleManager(Context? context)
=> PhasedUnitsModuleManager(getTypechecker, context, modules, outputRepositoryManager, false, null);
shared actual ModuleSourceMapper createModuleManagerUtil(Context? context, ModuleManager? moduleManager) {
assert (is LazyModuleManager moduleManager);
return LazyModuleSourceMapper(context, moduleManager, null);
}
};
tcb.moduleManagerFactory(mmf);
for (String path in args) {
tcb.addSrcDirectory(File(path));
}
typeChecker = tcb.typeChecker;
typeChecker.process();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment