diff --git a/build.xml b/build.xml
index 2b31fc8534e..dc174b339b4 100644
--- a/build.xml
+++ b/build.xml
@@ -73,6 +73,7 @@
+
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
index 46a4c4be556..c5019a2c3e0 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
@@ -11,7 +11,6 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetExpression;
-import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
@@ -112,7 +111,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
funClass,
new String[0]
);
- cv.visitSource(fun.getContainingFile().getName(), null);
+ cv.visitSource(state.transformFileName(fun.getContainingFile().getName()), null);
generateBridge(name, funDescriptor, fun, cv);
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
index ef735245949..5ef4d37c4e4 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
@@ -10,6 +10,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.util.containers.Stack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods;
+import org.jetbrains.jet.compiler.FileNameTransformer;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
@@ -33,11 +34,18 @@ public class GenerationState {
private final JetStandardLibrary standardLibrary;
private final IntrinsicMethods intrinsics;
+ private final FileNameTransformer fileNameTransformer;
+
public GenerationState(Project project, ClassBuilderFactory builderFactory) {
+ this(project, builderFactory, FileNameTransformer.IDENTITY);
+ }
+
+ public GenerationState(Project project, ClassBuilderFactory builderFactory, FileNameTransformer fileNameTransformer) {
this.project = project;
this.standardLibrary = JetStandardLibrary.getJetStandardLibrary(project);
this.factory = new ClassFileFactory(builderFactory, this);
this.intrinsics = new IntrinsicMethods(project, standardLibrary);
+ this.fileNameTransformer = fileNameTransformer;
}
@NotNull
@@ -186,4 +194,9 @@ public class GenerationState {
return answer.toString();
}
+
+ @NotNull
+ public String transformFileName(@NotNull String fileName) {
+ return fileNameTransformer.transformFileName(fileName);
+ }
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java
index a7f0f9e682a..68426aab20c 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java
@@ -14,7 +14,6 @@ import org.jetbrains.jet.lang.types.TypeProjection;
import org.jetbrains.jet.lexer.JetTokens;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.InstructionAdapter;
import org.objectweb.asm.commons.Method;
@@ -91,7 +90,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
signature.getSuperclassName(),
signature.getInterfaces().toArray(new String[0])
);
- v.visitSource(myClass.getContainingFile().getName(), null);
+ v.visitSource(state.transformFileName(myClass.getContainingFile().getName()), null);
ClassDescriptor container = getContainingClassDescriptor(descriptor);
if(container != null) {
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
index 9884dbe2c25..c70c7ac81a0 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
@@ -41,7 +41,7 @@ public class NamespaceCodegen {
new String[0]
);
// TODO figure something out for a namespace that spans multiple files
- v.visitSource(sourceFile.getName(), null);
+ v.visitSource(state.transformFileName(sourceFile.getName()), null);
}
public void generate(JetFile file) {
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/TraitImplBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/TraitImplBodyCodegen.java
index 7ef9ef7be3f..7f1afbf006c 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/TraitImplBodyCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/TraitImplBodyCodegen.java
@@ -54,7 +54,7 @@ public class TraitImplBodyCodegen extends ClassBodyCodegen {
"java/lang/Object",
new String[0]
);
- v.visitSource(myClass.getContainingFile().getName(), null);
+ v.visitSource(state.transformFileName(myClass.getContainingFile().getName()), null);
}
private String jvmName() {
diff --git a/compiler/backend/src/org/jetbrains/jet/compiler/FileNameTransformer.java b/compiler/backend/src/org/jetbrains/jet/compiler/FileNameTransformer.java
new file mode 100644
index 00000000000..68de18537fb
--- /dev/null
+++ b/compiler/backend/src/org/jetbrains/jet/compiler/FileNameTransformer.java
@@ -0,0 +1,19 @@
+package org.jetbrains.jet.compiler;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author abreslav
+ */
+public interface FileNameTransformer {
+ FileNameTransformer IDENTITY = new FileNameTransformer() {
+ @NotNull
+ @Override
+ public String transformFileName(@NotNull String fileName) {
+ return fileName;
+ }
+ };
+
+ @NotNull
+ String transformFileName(@NotNull String fileName);
+}
diff --git a/compiler/cli/src/org/jetbrains/jet/cli/KotlinCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/KotlinCompiler.java
index 2db7d09a465..0cebe6264fb 100644
--- a/compiler/cli/src/org/jetbrains/jet/cli/KotlinCompiler.java
+++ b/compiler/cli/src/org/jetbrains/jet/cli/KotlinCompiler.java
@@ -2,8 +2,10 @@ package org.jetbrains.jet.cli;
import com.sampullara.cli.Args;
import com.sampullara.cli.Argument;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.compiler.CompileEnvironment;
import org.jetbrains.jet.compiler.CompileEnvironmentException;
+import org.jetbrains.jet.compiler.FileNameTransformer;
import java.io.PrintStream;
@@ -13,6 +15,14 @@ import java.io.PrintStream;
*/
@SuppressWarnings("UseOfSystemOutOrSystemErr")
public class KotlinCompiler {
+ private static final FileNameTransformer ANY_EXTENSION_TO_JAVA = new FileNameTransformer() {
+ @NotNull
+ @Override
+ public String transformFileName(@NotNull String fileName) {
+ return fileName.replaceFirst("\\.\\w+$", ".java");
+ }
+ };
+
private KotlinCompiler() {
}
@@ -40,6 +50,9 @@ public class KotlinCompiler {
@Argument(value = "ignoreErrors", description = "Emit byte code even if there are compilation errors (not recommended)")
public boolean ignoreErrors;
+
+ @Argument(value = "transformNamesToJava", description = "Transform Kotlin file names to *.java. This option is needed for compiling kotlinized Java library headers")
+ public boolean transformNamesToJava;
}
private static void usage(PrintStream target) {
@@ -79,7 +92,7 @@ public class KotlinCompiler {
return 0;
}
- CompileEnvironment environment = new CompileEnvironment();
+ CompileEnvironment environment = new CompileEnvironment(arguments.transformNamesToJava ? ANY_EXTENSION_TO_JAVA : FileNameTransformer.IDENTITY);
environment.setIgnoreErrors(arguments.ignoreErrors);
if (arguments.stdlib != null) {
diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java
index 07b24d67044..72a599d9f26 100644
--- a/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java
+++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompileEnvironment.java
@@ -35,17 +35,23 @@ public class CompileEnvironment {
private JetCoreEnvironment myEnvironment;
private final Disposable myRootDisposable;
private PrintStream myErrorStream = System.out;
+ private final FileNameTransformer myFileNameTransformer;
private URL myStdlib;
private boolean ignoreErrors = false;
public CompileEnvironment() {
+ this(FileNameTransformer.IDENTITY);
+ }
+
+ public CompileEnvironment(FileNameTransformer fileNameTransformer) {
myRootDisposable = new Disposable() {
@Override
public void dispose() {
}
};
myEnvironment = new JetCoreEnvironment(myRootDisposable);
+ myFileNameTransformer = fileNameTransformer;
}
public void setErrorStream(PrintStream errorStream) {
@@ -148,7 +154,7 @@ public class CompileEnvironment {
}
public List loadModuleScript(String moduleFile) {
- CompileSession scriptCompileSession = new CompileSession(myEnvironment);
+ CompileSession scriptCompileSession = new CompileSession(myEnvironment, myFileNameTransformer);
scriptCompileSession.addSources(moduleFile);
ensureRuntime();
@@ -289,7 +295,7 @@ public class CompileEnvironment {
}
public boolean compileBunchOfSources(String sourceFileOrDir, String jar, String outputDir, boolean includeRuntime) {
- CompileSession session = new CompileSession(myEnvironment);
+ CompileSession session = new CompileSession(myEnvironment, myFileNameTransformer);
session.addSources(sourceFileOrDir);
String mainClass = null;
diff --git a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java
index 62b6efad28c..f0c6279baed 100644
--- a/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java
+++ b/compiler/cli/src/org/jetbrains/jet/compiler/CompileSession.java
@@ -29,6 +29,7 @@ public class CompileSession {
private final JetCoreEnvironment myEnvironment;
private final List mySourceFiles = new ArrayList();
private final List myLibrarySourceFiles = new ArrayList();
+ private final FileNameTransformer myFileNameTransformer;
private List myErrors = new ArrayList();
public BindingContext getMyBindingContext() {
@@ -38,7 +39,12 @@ public class CompileSession {
private BindingContext myBindingContext;
public CompileSession(JetCoreEnvironment environment) {
+ this(environment, FileNameTransformer.IDENTITY);
+ }
+
+ public CompileSession(JetCoreEnvironment environment, FileNameTransformer fileNameTransformer) {
myEnvironment = environment;
+ myFileNameTransformer = fileNameTransformer;
}
public void addSources(String path) {
@@ -115,13 +121,13 @@ public class CompileSession {
@NotNull
public ClassFileFactory generate() {
- GenerationState generationState = new GenerationState(myEnvironment.getProject(), ClassBuilderFactory.BINARIES);
+ GenerationState generationState = new GenerationState(myEnvironment.getProject(), ClassBuilderFactory.BINARIES, myFileNameTransformer);
generationState.compileCorrectFiles(myBindingContext, mySourceFiles);
return generationState.getFactory();
}
public String generateText() {
- GenerationState generationState = new GenerationState(myEnvironment.getProject(), ClassBuilderFactory.TEXT);
+ GenerationState generationState = new GenerationState(myEnvironment.getProject(), ClassBuilderFactory.TEXT, myFileNameTransformer);
generationState.compileCorrectFiles(myBindingContext, mySourceFiles);
return generationState.createText();
}