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(); }