Search in sources :

Example 1 with JavaCompiler

use of org.eclipse.ceylon.javax.tools.JavaCompiler 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 JavaCompiler

use of org.eclipse.ceylon.javax.tools.JavaCompiler in project ceylon by eclipse.

the class CeylonDocToolTests method compileSdkJavaFiles.

/**
 * This is disgusting, but the current CeylonDoc doesn't handle source files, so we need to compile them first,
 * and we do it using javac to avoid compiling the whole SDK for one java file.
 */
private void compileSdkJavaFiles() throws FileNotFoundException, IOException {
    // put it all in a special folder
    File dir = new File("build", "CeylonDocToolTest/" + name.getMethodName());
    if (dir.exists()) {
        FileUtil.delete(dir);
    }
    dir.mkdirs();
    // download a required jar
    RepositoryManager repoManager = CeylonUtils.repoManager().systemRepo("../dist/dist/repo").buildManager();
    File jbossModulesModule = repoManager.getArtifact(new ArtifactContext(null, "org.jboss.modules", Versions.DEPENDENCY_JBOSS_MODULES_VERSION, ".jar"));
    File runtimeModule = repoManager.getArtifact(new ArtifactContext(null, "ceylon.runtime", Versions.CEYLON_VERSION_NUMBER, ".jar"));
    File modelModule = repoManager.getArtifact(new ArtifactContext(null, "org.eclipse.ceylon.model", Versions.CEYLON_VERSION_NUMBER, ".jar"));
    File undertowCoreModule = repoManager.getArtifact(new ArtifactContext(null, "io.undertow.core", "1.3.5.Final", ".jar"));
    File languageModule = repoManager.getArtifact(new ArtifactContext(null, AbstractModelLoader.CEYLON_LANGUAGE, TypeChecker.LANGUAGE_MODULE_VERSION, ".car"));
    // fire up the java compiler
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    assertNotNull("Missing Java compiler, this test is probably being run with a JRE instead of a JDK!", compiler);
    List<String> options = Arrays.asList("-sourcepath", "../../ceylon-sdk/source", "-d", dir.getAbsolutePath(), "-classpath", undertowCoreModule.getAbsolutePath() + File.pathSeparator + jbossModulesModule.getAbsolutePath() + File.pathSeparator + runtimeModule.getAbsolutePath() + File.pathSeparator + modelModule.getAbsolutePath() + File.pathSeparator + languageModule.getAbsolutePath());
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
    String[] fileNames = new String[] { "ceylon/interop/java/internal/javaBooleanArray_.java", "ceylon/interop/java/internal/javaByteArray_.java", "ceylon/interop/java/internal/javaCharArray_.java", "ceylon/interop/java/internal/javaDoubleArray_.java", "ceylon/interop/java/internal/javaFloatArray_.java", "ceylon/interop/java/internal/javaIntArray_.java", "ceylon/interop/java/internal/javaLongArray_.java", "ceylon/interop/java/internal/javaObjectArray_.java", "ceylon/interop/java/internal/javaShortArray_.java", "ceylon/interop/java/internal/javaStringArray_.java", "ceylon/interop/java/internal/synchronize_.java" };
    List<String> qualifiedNames = new ArrayList<String>(fileNames.length);
    for (String name : fileNames) {
        qualifiedNames.add("../../ceylon-sdk/source/" + name);
    }
    Iterable<? extends JavaFileObject> fileObjects = fileManager.getJavaFileObjectsFromStrings(qualifiedNames);
    CompilationTask task = compiler.getTask(null, null, null, options, null, fileObjects);
    Boolean ret = task.call();
    Assert.assertEquals("Compilation failed", Boolean.TRUE, ret);
    // now we need to zip it up
    makeCarFromClassFiles(dir, fileNames, "ceylon.test", Versions.CEYLON_VERSION_NUMBER);
    makeCarFromClassFiles(dir, fileNames, "ceylon.http.server", Versions.CEYLON_VERSION_NUMBER);
    makeCarFromClassFiles(dir, fileNames, "ceylon.interop.java", Versions.CEYLON_VERSION_NUMBER);
    makeCarFromClassFiles(dir, fileNames, "ceylon.transaction", Versions.CEYLON_VERSION_NUMBER);
}
Also used : ArrayList(java.util.ArrayList) JavaCompiler(org.eclipse.ceylon.javax.tools.JavaCompiler) StandardJavaFileManager(org.eclipse.ceylon.javax.tools.StandardJavaFileManager) RepositoryManager(org.eclipse.ceylon.cmr.api.RepositoryManager) ArtifactContext(org.eclipse.ceylon.cmr.api.ArtifactContext) File(java.io.File) CompilationTask(org.eclipse.ceylon.javax.tools.JavaCompiler.CompilationTask)

Example 3 with JavaCompiler

use of org.eclipse.ceylon.javax.tools.JavaCompiler in project ceylon by eclipse.

the class CompilerTests method compileJavaModule.

protected void compileJavaModule(File jarOutputFolder, File classesOutputFolder, String moduleName, String moduleVersion, File sourceFolder, File[] extraClassPath, String... sourceFileNames) throws IOException {
    JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
    assertNotNull("Missing Java compiler, this test is probably being run with a JRE instead of a JDK!", javaCompiler);
    StandardJavaFileManager fileManager = javaCompiler.getStandardFileManager(null, null, null);
    Set<String> sourceDirectories = new HashSet<String>();
    File[] javaSourceFiles = new File[sourceFileNames.length];
    for (int i = 0; i < javaSourceFiles.length; i++) {
        javaSourceFiles[i] = new File(sourceFolder, sourceFileNames[i]);
        String sfn = sourceFileNames[i].replace(File.separatorChar, '/');
        int p = sfn.lastIndexOf('/');
        String sourceDir = sfn.substring(0, p);
        sourceDirectories.add(sourceDir);
    }
    Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjects(javaSourceFiles);
    StringBuilder cp = new StringBuilder();
    for (int i = 0; i < extraClassPath.length; i++) {
        if (i > 0)
            cp.append(File.pathSeparator);
        cp.append(extraClassPath[i]);
    }
    CompilationTask task = javaCompiler.getTask(null, null, null, Arrays.asList("-d", classesOutputFolder.getPath(), "-cp", cp.toString(), "-sourcepath", sourceFolder.getPath()), null, compilationUnits);
    assertEquals(Boolean.TRUE, task.call());
    File jarFolder = new File(jarOutputFolder, moduleName.replace('.', File.separatorChar) + File.separatorChar + moduleVersion);
    jarFolder.mkdirs();
    File jarFile = new File(jarFolder, moduleName + "-" + moduleVersion + ".jar");
    // now jar it up
    JarOutputStream outputStream = new JarOutputStream(new FileOutputStream(jarFile));
    for (String sourceFileName : sourceFileNames) {
        String classFileName = sourceFileName.substring(0, sourceFileName.length() - 5) + ".class";
        ZipEntry entry = new ZipEntry(classFileName);
        outputStream.putNextEntry(entry);
        File classFile = new File(classesOutputFolder, classFileName);
        FileInputStream inputStream = new FileInputStream(classFile);
        Util.copy(inputStream, outputStream);
        inputStream.close();
        outputStream.flush();
    }
    outputStream.close();
    for (String sourceDir : sourceDirectories) {
        File module = null;
        String sourceName = "module.properties";
        File properties = new File(sourceFolder, sourceDir + File.separator + sourceName);
        if (properties.exists()) {
            module = properties;
        } else {
            sourceName = "module.xml";
            properties = new File(sourceFolder, sourceDir + File.separator + sourceName);
            if (properties.exists()) {
                module = properties;
            }
        }
        if (module != null) {
            File moduleFile = new File(sourceFolder, sourceDir + File.separator + sourceName);
            FileInputStream inputStream = new FileInputStream(moduleFile);
            FileOutputStream moduleOutputStream = new FileOutputStream(new File(jarFolder, sourceName));
            Util.copy(inputStream, moduleOutputStream);
            inputStream.close();
            moduleOutputStream.flush();
            moduleOutputStream.close();
        }
    }
}
Also used : ZipEntry(java.util.zip.ZipEntry) JavaCompiler(org.eclipse.ceylon.javax.tools.JavaCompiler) JarOutputStream(java.util.jar.JarOutputStream) CompilationTask(org.eclipse.ceylon.javax.tools.JavaCompiler.CompilationTask) FileInputStream(java.io.FileInputStream) FileOutputStream(java.io.FileOutputStream) StandardJavaFileManager(org.eclipse.ceylon.javax.tools.StandardJavaFileManager) ZipFile(java.util.zip.ZipFile) File(java.io.File) HashSet(java.util.HashSet)

Example 4 with JavaCompiler

use of org.eclipse.ceylon.javax.tools.JavaCompiler in project ceylon by eclipse.

the class BcTests method compileJava.

private CompilationTask compileJava(String... sourcePaths) {
    java.util.List<File> sourceFiles = new ArrayList<File>(sourcePaths.length);
    for (String file : sourcePaths) {
        sourceFiles.add(new File(getPackagePath(), file));
    }
    JavaCompiler runCompiler = ToolProvider.getSystemJavaCompiler();
    assertNotNull("Missing Java compiler, this test is probably being run with a JRE instead of a JDK!", runCompiler);
    StandardJavaFileManager runFileManager = runCompiler.getStandardFileManager(null, null, null);
    // make sure the destination repo exists
    new File(destDir).mkdirs();
    List<String> options = new LinkedList<String>();
    options.addAll(Arrays.asList("-sourcepath", getSourcePath(), "-d", destDir, "-cp", getClassPathAsPath()));
    Iterable<? extends JavaFileObject> compilationUnits1 = runFileManager.getJavaFileObjectsFromFiles(sourceFiles);
    return runCompiler.getTask(null, runFileManager, null, options, null, compilationUnits1);
}
Also used : ArrayList(java.util.ArrayList) JavaCompiler(org.eclipse.ceylon.javax.tools.JavaCompiler) StandardJavaFileManager(org.eclipse.ceylon.javax.tools.StandardJavaFileManager) File(java.io.File) LinkedList(java.util.LinkedList)

Aggregations

File (java.io.File)4 JavaCompiler (org.eclipse.ceylon.javax.tools.JavaCompiler)4 StandardJavaFileManager (org.eclipse.ceylon.javax.tools.StandardJavaFileManager)4 ArrayList (java.util.ArrayList)3 HashSet (java.util.HashSet)2 CompilationTask (org.eclipse.ceylon.javax.tools.JavaCompiler.CompilationTask)2 FileInputStream (java.io.FileInputStream)1 FileOutputStream (java.io.FileOutputStream)1 LinkedList (java.util.LinkedList)1 JarOutputStream (java.util.jar.JarOutputStream)1 ZipEntry (java.util.zip.ZipEntry)1 ZipFile (java.util.zip.ZipFile)1 ArtifactContext (org.eclipse.ceylon.cmr.api.ArtifactContext)1 RepositoryManager (org.eclipse.ceylon.cmr.api.RepositoryManager)1 SupportedAnnotationTypes (org.eclipse.ceylon.javax.annotation.processing.SupportedAnnotationTypes)1 Location (org.eclipse.ceylon.javax.tools.JavaFileManager.Location)1 JavaFileObject (org.eclipse.ceylon.javax.tools.JavaFileObject)1 StandardLocation (org.eclipse.ceylon.javax.tools.StandardLocation)1 JavacTaskImpl (org.eclipse.ceylon.langtools.tools.javac.api.JavacTaskImpl)1 Attribute (org.eclipse.ceylon.langtools.tools.javac.code.Attribute)1