diff --git a/build-tools/build-tools.iml b/build-tools/build-tools.iml index ee9779446f1..7e88bcace67 100644 --- a/build-tools/build-tools.iml +++ b/build-tools/build-tools.iml @@ -22,6 +22,7 @@ + diff --git a/build-tools/core/src/org/jetbrains/jet/buildtools/core/BytecodeCompiler.java b/build-tools/core/src/org/jetbrains/jet/buildtools/core/BytecodeCompiler.java index 2e9678087a6..b753129b86a 100644 --- a/build-tools/core/src/org/jetbrains/jet/buildtools/core/BytecodeCompiler.java +++ b/build-tools/core/src/org/jetbrains/jet/buildtools/core/BytecodeCompiler.java @@ -23,6 +23,7 @@ import org.jetbrains.jet.cli.common.CompilerPlugin; import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys; import org.jetbrains.jet.cli.jvm.compiler.*; import org.jetbrains.jet.cli.common.messages.MessageCollector; +import org.jetbrains.jet.codegen.BuiltinToJavaTypesMapping; import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.lang.BuiltinsScopeExtensionMode; import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; @@ -74,7 +75,7 @@ public class BytecodeCompiler { CompilerSpecialMode.REGULAR); K2JVMCompileEnvironmentConfiguration env = new K2JVMCompileEnvironmentConfiguration(environment, MessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR, false, - BuiltinsScopeExtensionMode.ALL, false); + BuiltinsScopeExtensionMode.ALL, false, BuiltinToJavaTypesMapping.ENABLED); // lets register any compiler plugins env.getCompilerPlugins().addAll(getCompilerPlugins()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/BuiltinToJavaTypesMapping.java b/compiler/backend/src/org/jetbrains/jet/codegen/BuiltinToJavaTypesMapping.java new file mode 100644 index 00000000000..684408b936a --- /dev/null +++ b/compiler/backend/src/org/jetbrains/jet/codegen/BuiltinToJavaTypesMapping.java @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2012 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.codegen; + +/** + * Marks if backend's JetTypeMapper should map built-in types to Java types (e.g., jet.String into java.lang.String). + * Disabling is needed for compiling builtins: we want types to be jet.* instead of java.util* to make it possible to load + * builtins without JDK. + * + * @author Evgeny Gerashchenko + * @since 7/5/12 + */ +public enum BuiltinToJavaTypesMapping { + ENABLED, + DISABLED +} diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java index 2d5c4b856ee..94fc1509934 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java @@ -30,7 +30,6 @@ import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; import org.jetbrains.jet.lang.descriptors.ScriptDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.utils.Progress; @@ -61,11 +60,11 @@ public class GenerationState { public GenerationState(Project project, ClassBuilderFactory builderFactory, AnalyzeExhaust analyzeExhaust, List files) { - this(project, builderFactory, Progress.DEAF, analyzeExhaust, files, CompilerSpecialMode.REGULAR); + this(project, builderFactory, Progress.DEAF, analyzeExhaust, files, BuiltinToJavaTypesMapping.ENABLED); } public GenerationState(Project project, ClassBuilderFactory builderFactory, Progress progress, - @NotNull AnalyzeExhaust exhaust, @NotNull List files, @NotNull CompilerSpecialMode compilerSpecialMode) { + @NotNull AnalyzeExhaust exhaust, @NotNull List files, @NotNull BuiltinToJavaTypesMapping builtinToJavaTypesMapping) { this.project = project; this.progress = progress; this.analyzeExhaust = exhaust; @@ -73,7 +72,7 @@ public class GenerationState { this.classBuilderMode = builderFactory.getClassBuilderMode(); this.injector = new InjectorForJvmCodegen( analyzeExhaust.getBindingContext(), - this.files, project, compilerSpecialMode, builderFactory.getClassBuilderMode(), this, builderFactory); + this.files, project, builtinToJavaTypesMapping, builderFactory.getClassBuilderMode(), this, builderFactory); } private void markUsed() { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 9598653883b..bd151bfb576 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -25,7 +25,10 @@ import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind; import org.jetbrains.jet.codegen.signature.JvmMethodSignature; import org.jetbrains.jet.codegen.signature.JvmPropertyAccessorSignature; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.psi.JetClassObject; +import org.jetbrains.jet.lang.psi.JetClassOrObject; +import org.jetbrains.jet.lang.psi.JetElement; +import org.jetbrains.jet.lang.psi.JetObjectDeclaration; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils; @@ -70,7 +73,7 @@ public class JetTypeMapper { private JetStandardLibrary standardLibrary1; public BindingContext bindingContext; private ClosureAnnotator closureAnnotator; - private CompilerSpecialMode compilerSpecialMode; + private boolean mapBuiltinsToJava; private ClassBuilderMode classBuilderMode; @@ -85,8 +88,8 @@ public class JetTypeMapper { } @Inject - public void setCompilerSpecialMode(CompilerSpecialMode compilerSpecialMode) { - this.compilerSpecialMode = compilerSpecialMode; + public void setBuiltinToJavaTypesMapping(BuiltinToJavaTypesMapping builtinToJavaTypesMapping) { + mapBuiltinsToJava = builtinToJavaTypesMapping == BuiltinToJavaTypesMapping.ENABLED; } @Inject @@ -404,7 +407,7 @@ public class JetTypeMapper { Type known = null; ClassifierDescriptor classifier = jetType.getConstructor().getDeclarationDescriptor(); - if (compilerSpecialMode != CompilerSpecialMode.BUILTINS) { + if (mapBuiltinsToJava) { if (classifier instanceof ClassDescriptor) { KnownTypeKey key = new KnownTypeKey(DescriptorUtils.getFQName(classifier), jetType.isNullable()); known = knowTypes.get(key); @@ -422,7 +425,7 @@ public class JetTypeMapper { throw new IllegalStateException("TRAIT_IMPL is not possible for " + jetType); } else if (kind == MapTypeMode.IMPL) { - if (compilerSpecialMode != CompilerSpecialMode.BUILTINS) { + if (mapBuiltinsToJava) { // TODO: enable and fix tests //throw new IllegalStateException("must not map known type to IMPL when not compiling builtins: " + jetType); } @@ -457,7 +460,7 @@ public class JetTypeMapper { if (descriptor instanceof ClassDescriptor && JetStandardLibraryNames.ARRAY.is((ClassDescriptor) descriptor) - && compilerSpecialMode != CompilerSpecialMode.BUILTINS) { + && mapBuiltinsToJava) { if (jetType.getArguments().size() != 1) { throw new UnsupportedOperationException("arrays must have one type argument"); } @@ -493,7 +496,7 @@ public class JetTypeMapper { Type asmType; boolean forceReal; - if (JetStandardLibraryNames.COMPARABLE.is((ClassDescriptor) descriptor) && compilerSpecialMode != CompilerSpecialMode.BUILTINS) { + if (JetStandardLibraryNames.COMPARABLE.is((ClassDescriptor) descriptor) && mapBuiltinsToJava) { if (jetType.getArguments().size() != 1) { throw new UnsupportedOperationException("Comparable must have one type argument"); } @@ -559,7 +562,7 @@ public class JetTypeMapper { } private void checkValidType(@NotNull Type type) { - if (compilerSpecialMode == CompilerSpecialMode.BUILTINS) { + if (!mapBuiltinsToJava) { String descriptor = type.getDescriptor(); if (descriptor.equals("Ljava/lang/Object;")) { return; diff --git a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java index fecfb61c40c..c50776ed0ac 100644 --- a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJetTypeMapper.java @@ -21,7 +21,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import java.util.List; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.codegen.JetTypeMapper; -import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; +import org.jetbrains.jet.codegen.BuiltinToJavaTypesMapping; import org.jetbrains.jet.codegen.ClassBuilderMode; import org.jetbrains.jet.codegen.ClosureAnnotator; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -36,7 +36,7 @@ public class InjectorForJetTypeMapper { private final BindingContext bindingContext; private final List listOfJetFile; private JetTypeMapper jetTypeMapper; - private CompilerSpecialMode compilerSpecialMode; + private BuiltinToJavaTypesMapping builtinToJavaTypesMapping; private ClassBuilderMode classBuilderMode; private ClosureAnnotator closureAnnotator; @@ -47,14 +47,14 @@ public class InjectorForJetTypeMapper { this.bindingContext = bindingContext; this.listOfJetFile = listOfJetFile; this.jetTypeMapper = new JetTypeMapper(); - this.compilerSpecialMode = CompilerSpecialMode.REGULAR; + this.builtinToJavaTypesMapping = BuiltinToJavaTypesMapping.ENABLED; this.classBuilderMode = ClassBuilderMode.FULL; this.closureAnnotator = new ClosureAnnotator(); this.jetTypeMapper.setBindingContext(bindingContext); + this.jetTypeMapper.setBuiltinToJavaTypesMapping(builtinToJavaTypesMapping); this.jetTypeMapper.setClassBuilderMode(classBuilderMode); this.jetTypeMapper.setClosureAnnotator(closureAnnotator); - this.jetTypeMapper.setCompilerSpecialMode(compilerSpecialMode); closureAnnotator.setBindingContext(bindingContext); closureAnnotator.setFiles(listOfJetFile); diff --git a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java index 63b256b3f80..ece1021f6c3 100644 --- a/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/di/InjectorForJvmCodegen.java @@ -21,7 +21,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import java.util.List; import org.jetbrains.jet.lang.psi.JetFile; import com.intellij.openapi.project.Project; -import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; +import org.jetbrains.jet.codegen.BuiltinToJavaTypesMapping; import org.jetbrains.jet.codegen.ClassBuilderMode; import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.codegen.ClassBuilderFactory; @@ -36,7 +36,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import java.util.List; import org.jetbrains.jet.lang.psi.JetFile; import com.intellij.openapi.project.Project; -import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode; +import org.jetbrains.jet.codegen.BuiltinToJavaTypesMapping; import org.jetbrains.jet.codegen.ClassBuilderMode; import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.codegen.ClassBuilderFactory; @@ -49,7 +49,7 @@ public class InjectorForJvmCodegen { private final BindingContext bindingContext; private final List listOfJetFile; private final Project project; - private final CompilerSpecialMode compilerSpecialMode; + private final BuiltinToJavaTypesMapping builtinToJavaTypesMapping; private final ClassBuilderMode classBuilderMode; private final GenerationState generationState; private final ClassBuilderFactory classBuilderFactory; @@ -65,7 +65,7 @@ public class InjectorForJvmCodegen { @NotNull BindingContext bindingContext, @NotNull List listOfJetFile, @NotNull Project project, - @NotNull CompilerSpecialMode compilerSpecialMode, + @NotNull BuiltinToJavaTypesMapping builtinToJavaTypesMapping, @NotNull ClassBuilderMode classBuilderMode, @NotNull GenerationState generationState, @NotNull ClassBuilderFactory classBuilderFactory @@ -73,7 +73,7 @@ public class InjectorForJvmCodegen { this.bindingContext = bindingContext; this.listOfJetFile = listOfJetFile; this.project = project; - this.compilerSpecialMode = compilerSpecialMode; + this.builtinToJavaTypesMapping = builtinToJavaTypesMapping; this.classBuilderMode = classBuilderMode; this.generationState = generationState; this.classBuilderFactory = classBuilderFactory; @@ -86,9 +86,9 @@ public class InjectorForJvmCodegen { this.closureAnnotator = new ClosureAnnotator(); this.jetTypeMapper.setBindingContext(bindingContext); + this.jetTypeMapper.setBuiltinToJavaTypesMapping(builtinToJavaTypesMapping); this.jetTypeMapper.setClassBuilderMode(classBuilderMode); this.jetTypeMapper.setClosureAnnotator(closureAnnotator); - this.jetTypeMapper.setCompilerSpecialMode(compilerSpecialMode); this.classCodegen.setJetTypeMapper(jetTypeMapper); this.classCodegen.setState(generationState); diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java index 545479bb103..cf24dfa5ebb 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/K2JVMCompiler.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.cli.jvm.compiler.K2JVMCompileEnvironmentConfiguration; import org.jetbrains.jet.cli.jvm.compiler.KotlinToJVMBytecodeCompiler; import org.jetbrains.jet.cli.jvm.repl.ReplFromTerminal; +import org.jetbrains.jet.codegen.BuiltinToJavaTypesMapping; import org.jetbrains.jet.codegen.CompilationException; import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.lang.BuiltinsScopeExtensionMode; @@ -72,9 +73,10 @@ public class K2JVMCompiler extends CLICompiler plugins = configuration.getCompilerPlugins(); 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 8a815969dc5..115168c0365 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 @@ -35,6 +35,7 @@ import org.jetbrains.jet.cli.common.messages.MessageCollector; import org.jetbrains.jet.cli.common.messages.MessageCollectorToString; import org.jetbrains.jet.cli.jvm.JVMConfigurationKeys; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; +import org.jetbrains.jet.codegen.BuiltinToJavaTypesMapping; import org.jetbrains.jet.codegen.ClassBuilderFactories; import org.jetbrains.jet.codegen.CompilationErrorHandler; import org.jetbrains.jet.codegen.GenerationState; @@ -239,7 +240,7 @@ public class ReplInterpreter { GenerationState generationState = new GenerationState(jetCoreEnvironment.getProject(), ClassBuilderFactories.binaries(false), backendProgress, AnalyzeExhaust.success(trace.getBindingContext()), Collections.singletonList(psiFile), - jetCoreEnvironment.getCompilerSpecialMode()); + BuiltinToJavaTypesMapping.ENABLED); generationState.compileScript(psiFile.getScript(), scriptClassName, earierScripts, CompilationErrorHandler.THROW_EXCEPTION); for (String file : generationState.getFactory().files()) { diff --git a/compiler/tests/org/jetbrains/jet/codegen/CompileTextTest.java b/compiler/tests/org/jetbrains/jet/codegen/CompileTextTest.java index 68287701ec9..43add570c2e 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/CompileTextTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/CompileTextTest.java @@ -29,7 +29,8 @@ public class CompileTextTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(); String text = "import org.jetbrains.jet.codegen.CompileTextTest; fun x() = CompileTextTest()"; K2JVMCompileEnvironmentConfiguration configuration = new K2JVMCompileEnvironmentConfiguration( - myEnvironment, MessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR, false, BuiltinsScopeExtensionMode.ALL, false); + myEnvironment, MessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR, false, BuiltinsScopeExtensionMode.ALL, false, + BuiltinToJavaTypesMapping.ENABLED); configuration.getEnvironment().addToClasspathFromClassLoader(getClass().getClassLoader()); ClassLoader classLoader = KotlinToJVMBytecodeCompiler.compileText(configuration, text); Class namespace = classLoader.loadClass("namespace"); diff --git a/compiler/tests/org/jetbrains/jet/codegen/TestlibTest.java b/compiler/tests/org/jetbrains/jet/codegen/TestlibTest.java index 6c018abc32a..ea1dc994fe7 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/TestlibTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/TestlibTest.java @@ -86,7 +86,8 @@ public class TestlibTest extends CodegenTestCase { GenerationState generationState = KotlinToJVMBytecodeCompiler .analyzeAndGenerate(new K2JVMCompileEnvironmentConfiguration(myEnvironment, MessageCollector.PLAIN_TEXT_TO_SYSTEM_ERR, - false, BuiltinsScopeExtensionMode.ALL, false), false); + false, BuiltinsScopeExtensionMode.ALL, false, + BuiltinToJavaTypesMapping.ENABLED), false); if (generationState == null) { throw new RuntimeException("There were compilation errors"); diff --git a/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java b/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java index 5cdf657cd5c..fdea14e34e7 100644 --- a/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java +++ b/injector-generator/src/org/jetbrains/jet/di/AllInjectorsGenerator.java @@ -25,7 +25,10 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.calls.CallResolver; -import org.jetbrains.jet.lang.resolve.java.*; +import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration; +import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; +import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; +import org.jetbrains.jet.lang.resolve.java.PsiClassFinderImpl; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.lazy.ScopeProvider; import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolverDummyImpl; @@ -167,7 +170,7 @@ public class AllInjectorsGenerator { generator.addParameter(BindingContext.class); generator.addParameter(DiType.listOf(JetFile.class)); generator.addParameter(Project.class); - generator.addParameter(CompilerSpecialMode.class); + generator.addParameter(BuiltinToJavaTypesMapping.class); generator.addParameter(ClassBuilderMode.class); generator.addPublicParameter(GenerationState.class); generator.addParameter(ClassBuilderFactory.class); @@ -186,7 +189,7 @@ public class AllInjectorsGenerator { generator.addParameter(BindingContext.class); generator.addParameter(DiType.listOf(JetFile.class)); generator.addPublicField(JetTypeMapper.class); - generator.addField(CompilerSpecialMode.REGULAR); + generator.addField(BuiltinToJavaTypesMapping.ENABLED); generator.addField(ClassBuilderMode.FULL); generator.generate("compiler/backend/src", "org.jetbrains.jet.di", "InjectorForJetTypeMapper"); }