Extracted OutputFileFactory interface.

This commit is contained in:
Zalim Bashorov
2013-10-31 16:20:56 +04:00
parent 64e12398af
commit 5dd4eb780e
20 changed files with 71 additions and 19 deletions
+1
View File
@@ -24,6 +24,7 @@
<element id="directory" name="jet"> <element id="directory" name="jet">
<element id="dir-copy" path="$PROJECT_DIR$/idea/builtinsSrc/jet" /> <element id="dir-copy" path="$PROJECT_DIR$/idea/builtinsSrc/jet" />
</element> </element>
<element id="module-output" name="backend-common" />
</element> </element>
<element id="library" level="project" name="js-libs" /> <element id="library" level="project" name="js-libs" />
<element id="library" level="project" name="javax.inject" /> <element id="library" level="project" name="javax.inject" />
+1
View File
@@ -6,6 +6,7 @@
<module fileurl="file://$PROJECT_DIR$/compiler/android-tests/android-tests.iml" filepath="$PROJECT_DIR$/compiler/android-tests/android-tests.iml" group="compiler" /> <module fileurl="file://$PROJECT_DIR$/compiler/android-tests/android-tests.iml" filepath="$PROJECT_DIR$/compiler/android-tests/android-tests.iml" group="compiler" />
<module fileurl="file://$PROJECT_DIR$/compiler/annotations-ext/annotations-ext.iml" filepath="$PROJECT_DIR$/compiler/annotations-ext/annotations-ext.iml" /> <module fileurl="file://$PROJECT_DIR$/compiler/annotations-ext/annotations-ext.iml" filepath="$PROJECT_DIR$/compiler/annotations-ext/annotations-ext.iml" />
<module fileurl="file://$PROJECT_DIR$/compiler/backend/backend.iml" filepath="$PROJECT_DIR$/compiler/backend/backend.iml" group="compiler/java" /> <module fileurl="file://$PROJECT_DIR$/compiler/backend/backend.iml" filepath="$PROJECT_DIR$/compiler/backend/backend.iml" group="compiler/java" />
<module fileurl="file://$PROJECT_DIR$/compiler/backend-common/backend-common.iml" filepath="$PROJECT_DIR$/compiler/backend-common/backend-common.iml" group="compiler" />
<module fileurl="file://$PROJECT_DIR$/build-tools/build-tools.iml" filepath="$PROJECT_DIR$/build-tools/build-tools.iml" /> <module fileurl="file://$PROJECT_DIR$/build-tools/build-tools.iml" filepath="$PROJECT_DIR$/build-tools/build-tools.iml" />
<module fileurl="file://$PROJECT_DIR$/compiler/cli/cli.iml" filepath="$PROJECT_DIR$/compiler/cli/cli.iml" group="compiler/cli" /> <module fileurl="file://$PROJECT_DIR$/compiler/cli/cli.iml" filepath="$PROJECT_DIR$/compiler/cli/cli.iml" group="compiler/cli" />
<module fileurl="file://$PROJECT_DIR$/compiler/cli/cli-common/cli-common.iml" filepath="$PROJECT_DIR$/compiler/cli/cli-common/cli-common.iml" group="compiler/cli" /> <module fileurl="file://$PROJECT_DIR$/compiler/cli/cli-common/cli-common.iml" filepath="$PROJECT_DIR$/compiler/cli/cli-common/cli-common.iml" group="compiler/cli" />
+2
View File
@@ -60,6 +60,7 @@
<include name="core/descriptor.loader.java/src"/> <include name="core/descriptor.loader.java/src"/>
<include name="compiler/frontend.java/src"/> <include name="compiler/frontend.java/src"/>
<include name="core/serialization.java/src"/> <include name="core/serialization.java/src"/>
<include name="compiler/backend-common/src"/>
<include name="compiler/backend/src"/> <include name="compiler/backend/src"/>
<include name="compiler/cli/src"/> <include name="compiler/cli/src"/>
<include name="compiler/cli/cli-common/src"/> <include name="compiler/cli/cli-common/src"/>
@@ -139,6 +140,7 @@
<fileset dir="core/descriptors/src"/> <fileset dir="core/descriptors/src"/>
<fileset dir="core/descriptor.loader.java/src"/> <fileset dir="core/descriptor.loader.java/src"/>
<fileset dir="compiler/frontend.java/src"/> <fileset dir="compiler/frontend.java/src"/>
<fileset dir="compiler/backend-common/src"/>
<fileset dir="compiler/backend/src"/> <fileset dir="compiler/backend/src"/>
<fileset dir="compiler/cli/src"/> <fileset dir="compiler/cli/src"/>
<fileset dir="j2k/src"/> <fileset dir="j2k/src"/>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="kotlin-runtime" level="project" />
</component>
</module>
@@ -0,0 +1,27 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* 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 org.jetbrains.jet
import java.io.File
public trait OutputFileFactory {
public val outputFiles: List<String>
public fun getSourceFiles(file: String): List<File>
public fun asBytes(file: String): ByteArray
public fun asText(file: String): String
}
+1
View File
@@ -16,6 +16,7 @@
<orderEntry type="module" module-name="serialization.java" /> <orderEntry type="module" module-name="serialization.java" />
<orderEntry type="module" module-name="descriptor.loader.java" /> <orderEntry type="module" module-name="descriptor.loader.java" />
<orderEntry type="module" module-name="util" /> <orderEntry type="module" module-name="util" />
<orderEntry type="module" module-name="backend-common" exported="" />
</component> </component>
</module> </module>
@@ -24,6 +24,7 @@ import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.asm4.Type; import org.jetbrains.asm4.Type;
import org.jetbrains.jet.OutputFileFactory;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.GenerationStateAware; import org.jetbrains.jet.codegen.state.GenerationStateAware;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
@@ -38,7 +39,7 @@ import static org.jetbrains.jet.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClass
import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive; import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive;
import static org.jetbrains.jet.lang.resolve.java.PackageClassUtils.getPackageClassFqName; import static org.jetbrains.jet.lang.resolve.java.PackageClassUtils.getPackageClassFqName;
public final class ClassFileFactory extends GenerationStateAware { public final class ClassFileFactory extends GenerationStateAware implements OutputFileFactory {
@NotNull private ClassBuilderFactory builderFactory; @NotNull private ClassBuilderFactory builderFactory;
private final Map<FqName, NamespaceCodegen> ns2codegen = new HashMap<FqName, NamespaceCodegen>(); private final Map<FqName, NamespaceCodegen> ns2codegen = new HashMap<FqName, NamespaceCodegen>();
@@ -78,21 +79,25 @@ public final class ClassFileFactory extends GenerationStateAware {
} }
} }
@Override
public String asText(String file) { public String asText(String file) {
done(); done();
return builderFactory.asText(generators.get(file).classBuilder); return builderFactory.asText(generators.get(file).classBuilder);
} }
@Override
public byte[] asBytes(String file) { public byte[] asBytes(String file) {
done(); done();
return builderFactory.asBytes(generators.get(file).classBuilder); return builderFactory.asBytes(generators.get(file).classBuilder);
} }
public List<String> files() { @Override
public List<String> getOutputFiles() {
done(); done();
return new ArrayList<String>(generators.keySet()); return new ArrayList<String>(generators.keySet());
} }
@Override
public List<File> getSourceFiles(String relativeClassFilePath) { public List<File> getSourceFiles(String relativeClassFilePath) {
ClassBuilderAndSourceFileList pair = generators.get(relativeClassFilePath); ClassBuilderAndSourceFileList pair = generators.get(relativeClassFilePath);
if (pair == null) { if (pair == null) {
@@ -116,7 +121,7 @@ public final class ClassFileFactory extends GenerationStateAware {
public String createText() { public String createText() {
StringBuilder answer = new StringBuilder(); StringBuilder answer = new StringBuilder();
List<String> files = files(); List<String> files = getOutputFiles();
for (String file : files) { for (String file : files) {
// if (!file.startsWith("kotlin/")) { // if (!file.startsWith("kotlin/")) {
answer.append("@").append(file).append('\n'); answer.append("@").append(file).append('\n');
@@ -33,7 +33,7 @@ public class GeneratedClassLoader extends URLClassLoader {
@Override @Override
protected Class<?> findClass(@NotNull String name) throws ClassNotFoundException { protected Class<?> findClass(@NotNull String name) throws ClassNotFoundException {
String file = name.replace('.', '/') + ".class"; String file = name.replace('.', '/') + ".class";
if (state.files().contains(file)) { if (state.getOutputFiles().contains(file)) {
byte[] bytes = state.asBytes(file); byte[] bytes = state.asBytes(file);
return defineClass(name, bytes, 0, bytes.length); return defineClass(name, bytes, 0, bytes.length);
} }
+1
View File
@@ -17,6 +17,7 @@
<orderEntry type="module" module-name="cli-common" exported="" /> <orderEntry type="module" module-name="cli-common" exported="" />
<orderEntry type="module" module-name="descriptor.loader.java" /> <orderEntry type="module" module-name="descriptor.loader.java" />
<orderEntry type="module" module-name="util" /> <orderEntry type="module" module-name="util" />
<orderEntry type="module" module-name="backend-common" />
</component> </component>
</module> </module>
@@ -26,6 +26,7 @@ import jet.modules.AllModules;
import jet.modules.Module; import jet.modules.Module;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.OutputFileFactory;
import org.jetbrains.jet.cli.common.CLIConfigurationKeys; import org.jetbrains.jet.cli.common.CLIConfigurationKeys;
import org.jetbrains.jet.cli.common.messages.*; import org.jetbrains.jet.cli.common.messages.*;
import org.jetbrains.jet.cli.common.modules.ModuleDescription; import org.jetbrains.jet.cli.common.modules.ModuleDescription;
@@ -178,7 +179,7 @@ public class CompileEnvironmentUtil {
mainAttributes.putValue("Main-Class", mainClass.asString()); mainAttributes.putValue("Main-Class", mainClass.asString());
} }
JarOutputStream stream = new JarOutputStream(fos, manifest); JarOutputStream stream = new JarOutputStream(fos, manifest);
for (String file : factory.files()) { for (String file : factory.getOutputFiles()) {
stream.putNextEntry(new JarEntry(file)); stream.putNextEntry(new JarEntry(file));
stream.write(factory.asBytes(file)); stream.write(factory.asBytes(file));
} }
@@ -252,11 +253,11 @@ public class CompileEnvironmentUtil {
} }
public static void writeToOutputWithDirector( public static void writeToOutputWithDirector(
ClassFileFactory factory, OutputFileFactory factory,
@NotNull OutputDirector outputDirector, @NotNull OutputDirector outputDirector,
@NotNull MessageCollector messageCollector @NotNull MessageCollector messageCollector
) { ) {
List<String> files = factory.files(); List<String> files = factory.getOutputFiles();
for (String file : files) { for (String file : files) {
List<File> sourceFiles = factory.getSourceFiles(file); List<File> sourceFiles = factory.getSourceFiles(file);
File target = new File(outputDirector.getOutputDirectory(sourceFiles), file); File target = new File(outputDirector.getOutputDirectory(sourceFiles), file);
@@ -241,7 +241,7 @@ public class ReplInterpreter {
compileScript(psiFile.getScript(), scriptClassType, earlierScripts, generationState, compileScript(psiFile.getScript(), scriptClassType, earlierScripts, generationState,
CompilationErrorHandler.THROW_EXCEPTION); CompilationErrorHandler.THROW_EXCEPTION);
for (String file : generationState.getFactory().files()) { for (String file : generationState.getFactory().getOutputFiles()) {
classLoader.addClass(JvmClassName.byInternalName(file.replaceFirst("\\.class$", "")), generationState.getFactory().asBytes(file)); classLoader.addClass(JvmClassName.byInternalName(file.replaceFirst("\\.class$", "")), generationState.getFactory().asBytes(file));
} }
@@ -77,7 +77,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<PsiJavaFi
public void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files) { public void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files) {
NamespaceCodegen codegen = state.getFactory().forNamespace(packageFqName, files); NamespaceCodegen codegen = state.getFactory().forNamespace(packageFqName, files);
codegen.generate(CompilationErrorHandler.THROW_EXCEPTION); codegen.generate(CompilationErrorHandler.THROW_EXCEPTION);
state.getFactory().files(); state.getFactory().getOutputFiles();
} }
}); });
} }
@@ -107,7 +107,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider<PsiJavaFi
public void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files) { public void generate(@NotNull GenerationState state, @NotNull Collection<JetFile> files) {
NamespaceCodegen namespaceCodegen = state.getFactory().forNamespace(getPackageFqName(), files); NamespaceCodegen namespaceCodegen = state.getFactory().forNamespace(getPackageFqName(), files);
namespaceCodegen.generateClassOrObject(classOrObject); namespaceCodegen.generateClassOrObject(classOrObject);
state.getFactory().files(); state.getFactory().getOutputFiles();
} }
}); });
} }
@@ -69,7 +69,7 @@ public abstract class AbstractCheckLocalVariablesTableTest extends TestCaseWithT
String modifiedTestName = ktFile.getName().replace(".kt", ".class"); String modifiedTestName = ktFile.getName().replace(".kt", ".class");
boolean isClassFound = false; boolean isClassFound = false;
for (String filename : factory.files()) { for (String filename : factory.getOutputFiles()) {
if (filename.equals(modifiedTestName)) { if (filename.equals(modifiedTestName)) {
isClassFound = true; isClassFound = true;
ClassReader cr = new ClassReader(factory.asBytes(filename)); ClassReader cr = new ClassReader(factory.asBytes(filename));
@@ -40,7 +40,7 @@ public class DxChecker {
array[0] = "testArgs"; array[0] = "testArgs";
arguments.parse(array); arguments.parse(array);
for (String file : factory.files()) { for (String file : factory.getOutputFiles()) {
try { try {
CfTranslator.translate(file, factory.asBytes(file), arguments.cfOptions, arguments.dexOptions); CfTranslator.translate(file, factory.asBytes(file), arguments.cfOptions, arguments.dexOptions);
} }
@@ -39,7 +39,7 @@ public class KotlinPackageFragmentAnnotationTest extends CodegenTestCase {
String facadeFileName = JvmClassName.byFqNameWithoutInnerClasses(PackageClassUtils.getPackageClassFqName(NAMESPACE_NAME)).getInternalName() + ".class"; String facadeFileName = JvmClassName.byFqNameWithoutInnerClasses(PackageClassUtils.getPackageClassFqName(NAMESPACE_NAME)).getInternalName() + ".class";
ClassFileFactory factory = generateClassesInFile(); ClassFileFactory factory = generateClassesInFile();
for (String fileName : factory.files()) { for (String fileName : factory.getOutputFiles()) {
if (!fileName.equals(facadeFileName)) { if (!fileName.equals(facadeFileName)) {
// The file which is not a facade is a package fragment // The file which is not a facade is a package fragment
String fqName = fileName.substring(0, fileName.length() - ".class".length()).replace('/', '.'); String fqName = fileName.substring(0, fileName.length() - ".class".length()).replace('/', '.');
@@ -60,6 +60,6 @@ public class KotlinPackageFragmentAnnotationTest extends CodegenTestCase {
} }
} }
fail("No package fragment was found: " + factory.files()); fail("No package fragment was found: " + factory.getOutputFiles());
} }
} }
@@ -112,7 +112,7 @@ public class LineNumberTest extends TestCaseWithTmpdir {
private static List<Integer> extractActualLineNumbersFromBytecode(@NotNull GenerationState state, boolean testFunInvoke) { private static List<Integer> extractActualLineNumbersFromBytecode(@NotNull GenerationState state, boolean testFunInvoke) {
ClassFileFactory factory = state.getFactory(); ClassFileFactory factory = state.getFactory();
List<Integer> actualLineNumbers = Lists.newArrayList(); List<Integer> actualLineNumbers = Lists.newArrayList();
for (String filename : factory.files()) { for (String filename : factory.getOutputFiles()) {
if (PackageClassUtils.isPackageClassFqName(new FqName(FileUtil.getNameWithoutExtension(filename)))) { if (PackageClassUtils.isPackageClassFqName(new FqName(FileUtil.getNameWithoutExtension(filename)))) {
// Don't test line numbers in *Package facade classes // Don't test line numbers in *Package facade classes
continue; continue;
@@ -51,7 +51,7 @@ public class SyntheticMethodForAnnotatedPropertyGenTest extends CodegenTestCase
public void testTopLevel() { public void testTopLevel() {
loadFile(); loadFile();
String packageClassName = PackageClassUtils.getPackageClassName(FqName.ROOT); String packageClassName = PackageClassUtils.getPackageClassName(FqName.ROOT);
for (String fileName : generateClassesInFile().files()) { for (String fileName : generateClassesInFile().getOutputFiles()) {
if (fileName.startsWith(packageClassName) && !fileName.equals(packageClassName + ".class")) { if (fileName.startsWith(packageClassName) && !fileName.equals(packageClassName + ".class")) {
// This should be package$src class // This should be package$src class
Class<?> a = generateClass(fileName.substring(0, fileName.length() - ".class".length())); Class<?> a = generateClass(fileName.substring(0, fileName.length() - ".class".length()));
@@ -82,7 +82,7 @@ public abstract class AbstractWriteFlagsTest extends UsefulTestCase {
List<TestedObject> testedObjects = parseExpectedTestedObject(fileText); List<TestedObject> testedObjects = parseExpectedTestedObject(fileText);
for (TestedObject testedObject : testedObjects) { for (TestedObject testedObject : testedObjects) {
String className = null; String className = null;
for (String filename : factory.files()) { for (String filename : factory.getOutputFiles()) {
if (testedObject.isFullContainingClassName && filename.equals(testedObject.containingClass + ".class")) { if (testedObject.isFullContainingClassName && filename.equals(testedObject.containingClass + ".class")) {
className = filename; className = filename;
} }
@@ -106,7 +106,7 @@ public class BytecodeToolwindow extends JPanel implements Disposable {
StringBuilder answer = new StringBuilder(); StringBuilder answer = new StringBuilder();
ClassFileFactory factory = state.getFactory(); ClassFileFactory factory = state.getFactory();
for (String filename : factory.files()) { for (String filename : factory.getOutputFiles()) {
answer.append("// ================"); answer.append("// ================");
answer.append(filename); answer.append(filename);
answer.append(" =================\n"); answer.append(" =================\n");
@@ -128,7 +128,7 @@ public abstract class PositionManagerTestCase extends MultiFileTestCase {
private static Map<String, ReferenceType> getReferenceMap(ClassFileFactory classFileFactory) { private static Map<String, ReferenceType> getReferenceMap(ClassFileFactory classFileFactory) {
Map<String, ReferenceType> referencesByName = Maps.newHashMap(); Map<String, ReferenceType> referencesByName = Maps.newHashMap();
for (String classFileName : classFileFactory.files()) { for (String classFileName : classFileFactory.getOutputFiles()) {
String name = classFileName.substring(0, classFileName.lastIndexOf('.')); String name = classFileName.substring(0, classFileName.lastIndexOf('.'));
referencesByName.put(name, new MockReferenceType(name)); referencesByName.put(name, new MockReferenceType(name));
} }