diff --git a/.idea/artifacts/KotlinPlugin.xml b/.idea/artifacts/KotlinPlugin.xml index 96244617efa..5550cf923a2 100644 --- a/.idea/artifacts/KotlinPlugin.xml +++ b/.idea/artifacts/KotlinPlugin.xml @@ -24,6 +24,7 @@ + diff --git a/.idea/modules.xml b/.idea/modules.xml index f1cc2f0995e..c1c71eff775 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -6,6 +6,7 @@ + diff --git a/build.xml b/build.xml index 2aeccdcad58..0cfed881ffd 100644 --- a/build.xml +++ b/build.xml @@ -60,6 +60,7 @@ + @@ -139,6 +140,7 @@ + diff --git a/compiler/backend-common/backend-common.iml b/compiler/backend-common/backend-common.iml new file mode 100644 index 00000000000..3ff6ea7672e --- /dev/null +++ b/compiler/backend-common/backend-common.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/compiler/backend-common/src/OutputFileFactory.kt b/compiler/backend-common/src/OutputFileFactory.kt new file mode 100644 index 00000000000..3055224010a --- /dev/null +++ b/compiler/backend-common/src/OutputFileFactory.kt @@ -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 + + public fun getSourceFiles(file: String): List + public fun asBytes(file: String): ByteArray + public fun asText(file: String): String +} \ No newline at end of file diff --git a/compiler/backend/backend.iml b/compiler/backend/backend.iml index 6cd681955b5..45ae5fd4672 100644 --- a/compiler/backend/backend.iml +++ b/compiler/backend/backend.iml @@ -16,6 +16,7 @@ + diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java index 00661591e07..597efc5cef5 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java @@ -24,6 +24,7 @@ import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.asm4.Type; +import org.jetbrains.jet.OutputFileFactory; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationStateAware; 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.lang.resolve.java.PackageClassUtils.getPackageClassFqName; -public final class ClassFileFactory extends GenerationStateAware { +public final class ClassFileFactory extends GenerationStateAware implements OutputFileFactory { @NotNull private ClassBuilderFactory builderFactory; private final Map ns2codegen = new HashMap(); @@ -78,21 +79,25 @@ public final class ClassFileFactory extends GenerationStateAware { } } + @Override public String asText(String file) { done(); return builderFactory.asText(generators.get(file).classBuilder); } + @Override public byte[] asBytes(String file) { done(); return builderFactory.asBytes(generators.get(file).classBuilder); } - public List files() { + @Override + public List getOutputFiles() { done(); return new ArrayList(generators.keySet()); } + @Override public List getSourceFiles(String relativeClassFilePath) { ClassBuilderAndSourceFileList pair = generators.get(relativeClassFilePath); if (pair == null) { @@ -116,7 +121,7 @@ public final class ClassFileFactory extends GenerationStateAware { public String createText() { StringBuilder answer = new StringBuilder(); - List files = files(); + List files = getOutputFiles(); for (String file : files) { // if (!file.startsWith("kotlin/")) { answer.append("@").append(file).append('\n'); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java b/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java index c151b0ca4ba..53bd07f28f6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java @@ -33,7 +33,7 @@ public class GeneratedClassLoader extends URLClassLoader { @Override protected Class findClass(@NotNull String name) throws ClassNotFoundException { String file = name.replace('.', '/') + ".class"; - if (state.files().contains(file)) { + if (state.getOutputFiles().contains(file)) { byte[] bytes = state.asBytes(file); return defineClass(name, bytes, 0, bytes.length); } diff --git a/compiler/cli/cli.iml b/compiler/cli/cli.iml index d9fad8ad997..a8b242b3638 100644 --- a/compiler/cli/cli.iml +++ b/compiler/cli/cli.iml @@ -17,6 +17,7 @@ + diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java index e2aeffd744e..2bc1c887153 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java @@ -26,6 +26,7 @@ import jet.modules.AllModules; import jet.modules.Module; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.OutputFileFactory; import org.jetbrains.jet.cli.common.CLIConfigurationKeys; import org.jetbrains.jet.cli.common.messages.*; import org.jetbrains.jet.cli.common.modules.ModuleDescription; @@ -178,7 +179,7 @@ public class CompileEnvironmentUtil { mainAttributes.putValue("Main-Class", mainClass.asString()); } JarOutputStream stream = new JarOutputStream(fos, manifest); - for (String file : factory.files()) { + for (String file : factory.getOutputFiles()) { stream.putNextEntry(new JarEntry(file)); stream.write(factory.asBytes(file)); } @@ -252,11 +253,11 @@ public class CompileEnvironmentUtil { } public static void writeToOutputWithDirector( - ClassFileFactory factory, + OutputFileFactory factory, @NotNull OutputDirector outputDirector, @NotNull MessageCollector messageCollector ) { - List files = factory.files(); + List files = factory.getOutputFiles(); for (String file : files) { List sourceFiles = factory.getSourceFiles(file); File target = new File(outputDirector.getOutputDirectory(sourceFiles), file); diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java index d548fa94768..59d695f37ce 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java @@ -241,7 +241,7 @@ public class ReplInterpreter { compileScript(psiFile.getScript(), scriptClassType, earlierScripts, generationState, 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)); } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java index 97d2dbed60d..7bbf16e9054 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinJavaFileStubProvider.java @@ -77,7 +77,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider files) { NamespaceCodegen codegen = state.getFactory().forNamespace(packageFqName, files); codegen.generate(CompilationErrorHandler.THROW_EXCEPTION); - state.getFactory().files(); + state.getFactory().getOutputFiles(); } }); } @@ -107,7 +107,7 @@ public class KotlinJavaFileStubProvider implements CachedValueProvider files) { NamespaceCodegen namespaceCodegen = state.getFactory().forNamespace(getPackageFqName(), files); namespaceCodegen.generateClassOrObject(classOrObject); - state.getFactory().files(); + state.getFactory().getOutputFiles(); } }); } diff --git a/compiler/tests/org/jetbrains/jet/codegen/AbstractCheckLocalVariablesTableTest.java b/compiler/tests/org/jetbrains/jet/codegen/AbstractCheckLocalVariablesTableTest.java index 0ba32fd1758..ee3f4641bc8 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/AbstractCheckLocalVariablesTableTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/AbstractCheckLocalVariablesTableTest.java @@ -69,7 +69,7 @@ public abstract class AbstractCheckLocalVariablesTableTest extends TestCaseWithT String modifiedTestName = ktFile.getName().replace(".kt", ".class"); boolean isClassFound = false; - for (String filename : factory.files()) { + for (String filename : factory.getOutputFiles()) { if (filename.equals(modifiedTestName)) { isClassFound = true; ClassReader cr = new ClassReader(factory.asBytes(filename)); diff --git a/compiler/tests/org/jetbrains/jet/codegen/DxChecker.java b/compiler/tests/org/jetbrains/jet/codegen/DxChecker.java index 4f99548820e..93b8d0a5367 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/DxChecker.java +++ b/compiler/tests/org/jetbrains/jet/codegen/DxChecker.java @@ -40,7 +40,7 @@ public class DxChecker { array[0] = "testArgs"; arguments.parse(array); - for (String file : factory.files()) { + for (String file : factory.getOutputFiles()) { try { CfTranslator.translate(file, factory.asBytes(file), arguments.cfOptions, arguments.dexOptions); } diff --git a/compiler/tests/org/jetbrains/jet/codegen/KotlinPackageFragmentAnnotationTest.java b/compiler/tests/org/jetbrains/jet/codegen/KotlinPackageFragmentAnnotationTest.java index 00182119d5b..85cfb0d2981 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/KotlinPackageFragmentAnnotationTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/KotlinPackageFragmentAnnotationTest.java @@ -39,7 +39,7 @@ public class KotlinPackageFragmentAnnotationTest extends CodegenTestCase { String facadeFileName = JvmClassName.byFqNameWithoutInnerClasses(PackageClassUtils.getPackageClassFqName(NAMESPACE_NAME)).getInternalName() + ".class"; ClassFileFactory factory = generateClassesInFile(); - for (String fileName : factory.files()) { + for (String fileName : factory.getOutputFiles()) { if (!fileName.equals(facadeFileName)) { // The file which is not a facade is a package fragment 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()); } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java b/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java index e0d390d0448..dd1f59edd48 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java @@ -112,7 +112,7 @@ public class LineNumberTest extends TestCaseWithTmpdir { private static List extractActualLineNumbersFromBytecode(@NotNull GenerationState state, boolean testFunInvoke) { ClassFileFactory factory = state.getFactory(); List actualLineNumbers = Lists.newArrayList(); - for (String filename : factory.files()) { + for (String filename : factory.getOutputFiles()) { if (PackageClassUtils.isPackageClassFqName(new FqName(FileUtil.getNameWithoutExtension(filename)))) { // Don't test line numbers in *Package facade classes continue; diff --git a/compiler/tests/org/jetbrains/jet/codegen/SyntheticMethodForAnnotatedPropertyGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/SyntheticMethodForAnnotatedPropertyGenTest.java index d7f01c83e31..289f8635e70 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/SyntheticMethodForAnnotatedPropertyGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/SyntheticMethodForAnnotatedPropertyGenTest.java @@ -51,7 +51,7 @@ public class SyntheticMethodForAnnotatedPropertyGenTest extends CodegenTestCase public void testTopLevel() { loadFile(); String packageClassName = PackageClassUtils.getPackageClassName(FqName.ROOT); - for (String fileName : generateClassesInFile().files()) { + for (String fileName : generateClassesInFile().getOutputFiles()) { if (fileName.startsWith(packageClassName) && !fileName.equals(packageClassName + ".class")) { // This should be package$src class Class a = generateClass(fileName.substring(0, fileName.length() - ".class".length())); diff --git a/compiler/tests/org/jetbrains/jet/codegen/flags/AbstractWriteFlagsTest.java b/compiler/tests/org/jetbrains/jet/codegen/flags/AbstractWriteFlagsTest.java index 439d1486c2c..559ae0fce25 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/flags/AbstractWriteFlagsTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/flags/AbstractWriteFlagsTest.java @@ -82,7 +82,7 @@ public abstract class AbstractWriteFlagsTest extends UsefulTestCase { List testedObjects = parseExpectedTestedObject(fileText); for (TestedObject testedObject : testedObjects) { String className = null; - for (String filename : factory.files()) { + for (String filename : factory.getOutputFiles()) { if (testedObject.isFullContainingClassName && filename.equals(testedObject.containingClass + ".class")) { className = filename; } diff --git a/idea/src/org/jetbrains/jet/plugin/internal/codewindow/BytecodeToolwindow.java b/idea/src/org/jetbrains/jet/plugin/internal/codewindow/BytecodeToolwindow.java index 91b6c73e956..b245a92698a 100644 --- a/idea/src/org/jetbrains/jet/plugin/internal/codewindow/BytecodeToolwindow.java +++ b/idea/src/org/jetbrains/jet/plugin/internal/codewindow/BytecodeToolwindow.java @@ -106,7 +106,7 @@ public class BytecodeToolwindow extends JPanel implements Disposable { StringBuilder answer = new StringBuilder(); ClassFileFactory factory = state.getFactory(); - for (String filename : factory.files()) { + for (String filename : factory.getOutputFiles()) { answer.append("// ================"); answer.append(filename); answer.append(" =================\n"); diff --git a/idea/tests/org/jetbrains/jet/plugin/debugger/PositionManagerTestCase.java b/idea/tests/org/jetbrains/jet/plugin/debugger/PositionManagerTestCase.java index 6aa047a7c66..122e0ab5ccd 100644 --- a/idea/tests/org/jetbrains/jet/plugin/debugger/PositionManagerTestCase.java +++ b/idea/tests/org/jetbrains/jet/plugin/debugger/PositionManagerTestCase.java @@ -128,7 +128,7 @@ public abstract class PositionManagerTestCase extends MultiFileTestCase { private static Map getReferenceMap(ClassFileFactory classFileFactory) { Map referencesByName = Maps.newHashMap(); - for (String classFileName : classFileFactory.files()) { + for (String classFileName : classFileFactory.getOutputFiles()) { String name = classFileName.substring(0, classFileName.lastIndexOf('.')); referencesByName.put(name, new MockReferenceType(name)); }