Search in sources :

Example 1 with JavacTaskImpl

use of org.eclipse.ceylon.langtools.tools.javac.api.JavacTaskImpl in project ceylon by eclipse.

the class CreateSymbols method createSymbols.

void createSymbols() throws IOException {
    Set<String> legacy = getLegacyPackages();
    Set<String> legacyProprietary = getLegacyPackages();
    Set<String> documented = new HashSet<String>();
    Set<PackageSymbol> packages = ((JavacProcessingEnvironment) processingEnv).getSpecifiedPackages();
    Map<String, String> pOptions = processingEnv.getOptions();
    String jarName = pOptions.get("org.eclipse.ceylon.langtools.tools.javac.sym.Jar");
    if (jarName == null)
        throw new RuntimeException("Must use -Aorg.eclipse.ceylon.langtools.tools.javac.sym.Jar=LOCATION_OF_JAR");
    String destName = pOptions.get("org.eclipse.ceylon.langtools.tools.javac.sym.Dest");
    if (destName == null)
        throw new RuntimeException("Must use -Aorg.eclipse.ceylon.langtools.tools.javac.sym.Dest=LOCATION_OF_JAR");
    String profileSpec = pOptions.get("org.eclipse.ceylon.langtools.tools.javac.sym.Profiles");
    if (profileSpec == null)
        throw new RuntimeException("Must use -Aorg.eclipse.ceylon.langtools.tools.javac.sym.Profiles=PROFILES_SPEC");
    Profiles profiles = Profiles.read(new File(profileSpec));
    for (PackageSymbol psym : packages) {
        String name = psym.getQualifiedName().toString();
        legacyProprietary.remove(name);
        documented.add(name);
    }
    JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
    StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
    Location jarLocation = StandardLocation.locationFor(jarName);
    File jarFile = new File(jarName);
    fm.setLocation(jarLocation, List.of(jarFile));
    fm.setLocation(StandardLocation.CLASS_PATH, List.<File>nil());
    fm.setLocation(StandardLocation.SOURCE_PATH, List.<File>nil());
    {
        ArrayList<File> bootClassPath = new ArrayList<File>();
        bootClassPath.add(jarFile);
        for (File path : fm.getLocation(StandardLocation.PLATFORM_CLASS_PATH)) {
            if (!new File(path.getName()).equals(new File("rt.jar")))
                bootClassPath.add(path);
        }
        System.err.println("Using boot class path = " + bootClassPath);
        fm.setLocation(StandardLocation.PLATFORM_CLASS_PATH, bootClassPath);
    }
    // System.out.println(fm.getLocation(StandardLocation.PLATFORM_CLASS_PATH));
    File destDir = new File(destName);
    if (!destDir.exists())
        if (!destDir.mkdirs())
            throw new RuntimeException("Could not create " + destDir);
    fm.setLocation(StandardLocation.CLASS_OUTPUT, List.of(destDir));
    Set<String> hiddenPackages = new HashSet<String>();
    Set<String> crisp = new HashSet<String>();
    List<String> options = List.of("-XDdev");
    // options = options.prepend("-doe");
    // options = options.prepend("-verbose");
    JavacTaskImpl task = (JavacTaskImpl) tool.getTask(null, fm, null, options, null, null);
    org.eclipse.ceylon.langtools.tools.javac.main.JavaCompiler compiler = org.eclipse.ceylon.langtools.tools.javac.main.JavaCompiler.instance(task.getContext());
    ClassWriter writer = ClassWriter.instance(task.getContext());
    Symtab syms = Symtab.instance(task.getContext());
    Names names = Names.instance(task.getContext());
    Attribute.Compound proprietaryAnno = new Attribute.Compound(syms.proprietaryType, List.<Pair<Symbol.MethodSymbol, Attribute>>nil());
    Attribute.Compound[] profileAnnos = new Attribute.Compound[profiles.getProfileCount() + 1];
    Symbol.MethodSymbol profileValue = (MethodSymbol) syms.profileType.tsym.members().lookup(names.value).sym;
    for (int i = 1; i < profileAnnos.length; i++) {
        profileAnnos[i] = new Attribute.Compound(syms.profileType, List.<Pair<Symbol.MethodSymbol, Attribute>>of(new Pair<Symbol.MethodSymbol, Attribute>(profileValue, new Attribute.Constant(syms.intType, i))));
    }
    Type.moreInfo = true;
    Types types = Types.instance(task.getContext());
    Pool pool = new Pool(types);
    for (JavaFileObject file : fm.list(jarLocation, "", EnumSet.of(JavaFileObject.Kind.CLASS), true)) {
        String className = fm.inferBinaryName(jarLocation, file);
        int index = className.lastIndexOf('.');
        String pckName = index == -1 ? "" : className.substring(0, index);
        boolean addLegacyAnnotation = false;
        if (documented.contains(pckName)) {
            if (!legacy.contains(pckName))
                crisp.add(pckName);
        // System.out.println("Documented: " + className);
        } else if (legacyProprietary.contains(pckName)) {
            addLegacyAnnotation = true;
        // System.out.println("Legacy proprietary: " + className);
        } else {
            // System.out.println("Hidden " + className);
            hiddenPackages.add(pckName);
            continue;
        }
        TypeSymbol sym = (TypeSymbol) compiler.resolveIdent(className);
        if (sym.kind != Kinds.TYP) {
            if (className.indexOf('$') < 0) {
                System.err.println("Ignoring (other) " + className + " : " + sym);
                System.err.println("   " + sym.getClass().getSimpleName() + " " + sym.type);
            }
            continue;
        }
        sym.complete();
        if (sym.getEnclosingElement().getKind() != ElementKind.PACKAGE) {
            System.err.println("Ignoring (bad) " + sym.getQualifiedName());
            continue;
        }
        ClassSymbol cs = (ClassSymbol) sym;
        if (addLegacyAnnotation) {
            cs.prependAttributes(List.of(proprietaryAnno));
        }
        int p = profiles.getProfile(cs.fullname.toString().replace(".", "/"));
        if (0 < p && p < profileAnnos.length)
            cs.prependAttributes(List.of(profileAnnos[p]));
        writeClass(pool, cs, writer);
    }
    if (false) {
        for (String pckName : crisp) System.out.println("Crisp: " + pckName);
        for (String pckName : hiddenPackages) System.out.println("Hidden: " + pckName);
        for (String pckName : legacyProprietary) System.out.println("Legacy proprietary: " + pckName);
        for (String pckName : documented) System.out.println("Documented: " + pckName);
    }
}
Also used : JavacTaskImpl(org.eclipse.ceylon.langtools.tools.javac.api.JavacTaskImpl) SupportedAnnotationTypes(org.eclipse.ceylon.javax.annotation.processing.SupportedAnnotationTypes) Types(org.eclipse.ceylon.langtools.tools.javac.code.Types) Attribute(org.eclipse.ceylon.langtools.tools.javac.code.Attribute) Symbol(org.eclipse.ceylon.langtools.tools.javac.code.Symbol) ArrayList(java.util.ArrayList) Names(org.eclipse.ceylon.langtools.tools.javac.util.Names) JavaFileObject(org.eclipse.ceylon.javax.tools.JavaFileObject) StandardJavaFileManager(org.eclipse.ceylon.javax.tools.StandardJavaFileManager) Pool(org.eclipse.ceylon.langtools.tools.javac.jvm.Pool) HashSet(java.util.HashSet) Pair(org.eclipse.ceylon.langtools.tools.javac.util.Pair) JavaCompiler(org.eclipse.ceylon.javax.tools.JavaCompiler) ClassWriter(org.eclipse.ceylon.langtools.tools.javac.jvm.ClassWriter) Symtab(org.eclipse.ceylon.langtools.tools.javac.code.Symtab) JavacProcessingEnvironment(org.eclipse.ceylon.langtools.tools.javac.processing.JavacProcessingEnvironment) File(java.io.File) Location(org.eclipse.ceylon.javax.tools.JavaFileManager.Location) StandardLocation(org.eclipse.ceylon.javax.tools.StandardLocation)

Example 2 with JavacTaskImpl

use of org.eclipse.ceylon.langtools.tools.javac.api.JavacTaskImpl in project ceylon by eclipse.

the class ModelLoaderTests method verifyCompilerClassLoading.

protected void verifyCompilerClassLoading(String ceylon, final ModelComparison modelCompare) {
    // now compile the ceylon decl file
    CeyloncTaskImpl task = getCompilerTask(ceylon);
    // get the context to grab the phased units
    Context context = task.getContext();
    if (simpleAnnotationModels) {
        CeylonEnter.instance(context);
        ExpressionTransformer.getInstance(context).simpleAnnotationModels = true;
        CeylonTransformer.getInstance(context).simpleAnnotationModels = true;
        StatementTransformer.getInstance(context).simpleAnnotationModels = true;
        ClassTransformer.getInstance(context).simpleAnnotationModels = true;
    }
    Boolean success = task.call();
    Assert.assertTrue(success);
    PhasedUnits phasedUnits = LanguageCompiler.getPhasedUnitsInstance(context);
    // find out what was in that file
    Assert.assertEquals(2, phasedUnits.getPhasedUnits().size());
    PhasedUnit one = phasedUnits.getPhasedUnits().get(0);
    PhasedUnit two = phasedUnits.getPhasedUnits().get(1);
    PhasedUnit phasedUnit = one.getUnitFile().getName().endsWith("module.ceylon") ? two : one;
    final Map<String, Declaration> decls = new HashMap<String, Declaration>();
    for (Declaration decl : phasedUnit.getUnit().getDeclarations()) {
        if (decl.isToplevel()) {
            decls.put(getQualifiedPrefixedName(decl), decl);
        }
    }
    // now compile the ceylon usage file
    // remove the extension, make lowercase and add "test"
    String testfile = ceylon.substring(0, ceylon.length() - 7).toLowerCase() + "test.ceylon";
    JavacTaskImpl task2 = getCompilerTask(testfile);
    // get the context to grab the declarations
    final Context context2 = task2.getContext();
    // declarations from the jar anymore because we've overridden the jar and the javac jar index is corrupted
    class Listener implements TaskListener {

        @Override
        public void started(TaskEvent e) {
        }

        @Override
        public void finished(TaskEvent e) {
            if (e.getKind() == Kind.ENTER) {
                AbstractModelLoader modelLoader = CeylonModelLoader.instance(context2);
                Modules modules = LanguageCompiler.getCeylonContextInstance(context2).getModules();
                // now see if we can find our declarations
                compareDeclarations(modelCompare, decls, modelLoader, modules);
            }
        }
    }
    Listener listener = new Listener();
    task2.setTaskListener(listener);
    success = task2.call();
    Assert.assertTrue("Compilation failed", success);
    // now check with the runtime model loader too
    String module = moduleForJavaModelLoading();
    String version = "1";
    ModuleWithArtifact moduleWithArtifact = new ModuleWithArtifact(module, version);
    synchronized (RUN_LOCK) {
        // this initialises the metamodel, even if we don't use the resulting ClassLoader
        URLClassLoader classLoader;
        try {
            classLoader = getClassLoader("runtime model loader tests", moduleWithArtifact);
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
        try {
            RuntimeModuleManager moduleManager = Metamodel.getModuleManager();
            RuntimeModelLoader modelLoader = moduleManager.getModelLoader();
            Modules modules = moduleManager.getModules();
            // now see if we can find our declarations
            compareDeclarations(modelCompare, decls, modelLoader, modules);
        } finally {
            try {
                classLoader.close();
            } catch (IOException e) {
                // ignore
                e.printStackTrace();
            }
        }
    }
}
Also used : Context(org.eclipse.ceylon.langtools.tools.javac.util.Context) AbstractModelLoader(org.eclipse.ceylon.model.loader.AbstractModelLoader) JavacTaskImpl(org.eclipse.ceylon.langtools.tools.javac.api.JavacTaskImpl) MalformedURLException(java.net.MalformedURLException) RuntimeModuleManager(org.eclipse.ceylon.compiler.java.runtime.model.RuntimeModuleManager) TaskListener(org.eclipse.ceylon.langtools.source.util.TaskListener) HashMap(java.util.HashMap) Modules(org.eclipse.ceylon.model.typechecker.model.Modules) CeyloncTaskImpl(org.eclipse.ceylon.compiler.java.tools.CeyloncTaskImpl) IOException(java.io.IOException) PhasedUnit(org.eclipse.ceylon.compiler.typechecker.context.PhasedUnit) URLClassLoader(java.net.URLClassLoader) PhasedUnits(org.eclipse.ceylon.compiler.typechecker.context.PhasedUnits) TaskEvent(org.eclipse.ceylon.langtools.source.util.TaskEvent) TaskListener(org.eclipse.ceylon.langtools.source.util.TaskListener) RuntimeModelLoader(org.eclipse.ceylon.compiler.java.runtime.model.RuntimeModelLoader) TypedDeclaration(org.eclipse.ceylon.model.typechecker.model.TypedDeclaration) TypeDeclaration(org.eclipse.ceylon.model.typechecker.model.TypeDeclaration) Declaration(org.eclipse.ceylon.model.typechecker.model.Declaration)

Example 3 with JavacTaskImpl

use of org.eclipse.ceylon.langtools.tools.javac.api.JavacTaskImpl in project ceylon by eclipse.

the class ModelLoaderTests method verifyCompilerClassLoading.

protected void verifyCompilerClassLoading(String ceylon, final RunnableTest test, List<String> options) {
    // now compile the ceylon usage file
    JavacTaskImpl task2 = getCompilerTask(options, ceylon);
    // get the context to grab the declarations
    final Context context2 = task2.getContext();
    // declarations from the jar anymore because we've overridden the jar and the javac jar index is corrupted
    class Listener implements TaskListener {

        @Override
        public void started(TaskEvent e) {
        }

        @Override
        public void finished(TaskEvent e) {
            if (e.getKind() == Kind.ENTER) {
                CeylonModelLoader modelLoader = (CeylonModelLoader) CeylonModelLoader.instance(context2);
                test.test(modelLoader);
            }
        }
    }
    Listener listener = new Listener();
    task2.setTaskListener(listener);
    try {
        Boolean success = task2.call();
        Assert.assertTrue("Compilation failed", success);
    } catch (AssertionError x) {
        throw x;
    } catch (Throwable x) {
        // make sure we unwrap it
        while (x.getCause() != null) x = x.getCause();
        if (x instanceof Error)
            throw (Error) x;
        if (x instanceof RuntimeException)
            throw (RuntimeException) x;
        throw new RuntimeException(x);
    }
}
Also used : Context(org.eclipse.ceylon.langtools.tools.javac.util.Context) JavacTaskImpl(org.eclipse.ceylon.langtools.tools.javac.api.JavacTaskImpl) CeylonModelLoader(org.eclipse.ceylon.compiler.java.loader.CeylonModelLoader) TaskListener(org.eclipse.ceylon.langtools.source.util.TaskListener) TaskEvent(org.eclipse.ceylon.langtools.source.util.TaskEvent) TaskListener(org.eclipse.ceylon.langtools.source.util.TaskListener) CompilerError(org.eclipse.ceylon.compiler.java.test.CompilerError)

Aggregations

JavacTaskImpl (org.eclipse.ceylon.langtools.tools.javac.api.JavacTaskImpl)3 TaskEvent (org.eclipse.ceylon.langtools.source.util.TaskEvent)2 TaskListener (org.eclipse.ceylon.langtools.source.util.TaskListener)2 Context (org.eclipse.ceylon.langtools.tools.javac.util.Context)2 File (java.io.File)1 IOException (java.io.IOException)1 MalformedURLException (java.net.MalformedURLException)1 URLClassLoader (java.net.URLClassLoader)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 CeylonModelLoader (org.eclipse.ceylon.compiler.java.loader.CeylonModelLoader)1 RuntimeModelLoader (org.eclipse.ceylon.compiler.java.runtime.model.RuntimeModelLoader)1 RuntimeModuleManager (org.eclipse.ceylon.compiler.java.runtime.model.RuntimeModuleManager)1 CompilerError (org.eclipse.ceylon.compiler.java.test.CompilerError)1 CeyloncTaskImpl (org.eclipse.ceylon.compiler.java.tools.CeyloncTaskImpl)1 PhasedUnit (org.eclipse.ceylon.compiler.typechecker.context.PhasedUnit)1 PhasedUnits (org.eclipse.ceylon.compiler.typechecker.context.PhasedUnits)1 SupportedAnnotationTypes (org.eclipse.ceylon.javax.annotation.processing.SupportedAnnotationTypes)1 JavaCompiler (org.eclipse.ceylon.javax.tools.JavaCompiler)1