proper environment when compiling special things

* do not include anything when compiling builtins
* do not include kotlin-runtime and jdk-headers when compiling jdk-headers
This commit is contained in:
Stepan Koltsov
2012-03-30 03:54:58 +04:00
parent 3ee7bcee25
commit 2c4094f4d4
22 changed files with 154 additions and 70 deletions
+4 -2
View File
@@ -77,7 +77,8 @@
<arg value="${basedir}/jdk-headers/src"/> <arg value="${basedir}/jdk-headers/src"/>
<arg value="-output"/> <arg value="-output"/>
<arg value="${output}/classes/jdk-headers"/> <arg value="${output}/classes/jdk-headers"/>
<arg value="-stubs"/> <arg value="-mode"/>
<arg value="jdkHeaders"/>
</java> </java>
</target> </target>
@@ -92,7 +93,8 @@
<arg value="${basedir}/compiler/frontend/src"/> <arg value="${basedir}/compiler/frontend/src"/>
<arg value="-output"/> <arg value="-output"/>
<arg value="${output}/classes/lang"/> <arg value="${output}/classes/lang"/>
<arg value="-stubs"/> <arg value="-mode"/>
<arg value="builtins"/>
</java> </java>
</target> </target>
@@ -53,8 +53,8 @@ public class CompilerArguments {
@Argument(value = "help", alias = "h", description = "show help") @Argument(value = "help", alias = "h", description = "show help")
public boolean help; public boolean help;
@Argument(value = "stubs", description = "Compile stubs: ignore function bodies") @Argument(value = "mode", description = "Special compiler modes: stubs or jdkHeaders")
public boolean stubs; public String mode;
@Argument(value = "tags", description = "Demarcate each compilation message (error, warning, etc) with an open and close tag") @Argument(value = "tags", description = "Demarcate each compilation message (error, warning, etc) with an open and close tag")
public boolean tags; public boolean tags;
@@ -130,14 +130,6 @@ public class CompilerArguments {
this.stdlib = stdlib; this.stdlib = stdlib;
} }
public boolean isStubs() {
return stubs;
}
public void setStubs(boolean stubs) {
this.stubs = stubs;
}
public boolean isTags() { public boolean isTags() {
return tags; return tags;
} }
@@ -17,11 +17,9 @@
package org.jetbrains.jet.cli; package org.jetbrains.jet.cli;
import com.sampullara.cli.Args; import com.sampullara.cli.Args;
import org.jetbrains.jet.compiler.CompileEnvironment; import org.jetbrains.jet.compiler.*;
import org.jetbrains.jet.compiler.CompileEnvironmentException;
import org.jetbrains.jet.compiler.CompilerPlugin;
import org.jetbrains.jet.compiler.MessageRenderer;
import org.jetbrains.jet.lang.diagnostics.Severity; import org.jetbrains.jet.lang.diagnostics.Severity;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.List; import java.util.List;
@@ -99,7 +97,18 @@ public class KotlinCompiler {
errStream.println(messageRenderer.render(Severity.INFO, "Kotlin Compiler version " + CompilerVersion.VERSION, null, -1, -1)); errStream.println(messageRenderer.render(Severity.INFO, "Kotlin Compiler version " + CompilerVersion.VERSION, null, -1, -1));
} }
CompileEnvironment environment = new CompileEnvironment(messageRenderer, arguments.verbose); CompilerSpecialMode mode;
if (arguments.mode == null) {
mode = CompilerSpecialMode.REGULAR;
} else if (arguments.mode.equals("jdkHeaders")) {
mode = CompilerSpecialMode.JDK_HEADERS;
} else if (arguments.mode.equals("builtins")) {
mode = CompilerSpecialMode.BUILTINS;
} else {
throw new IllegalArgumentException("unknown compiler mode: " + arguments.mode);
}
CompileEnvironment environment = new CompileEnvironment(messageRenderer, arguments.verbose, mode);
try { try {
configureEnvironment(environment, arguments, errStream); configureEnvironment(environment, arguments, errStream);
@@ -163,8 +172,6 @@ public class KotlinCompiler {
environment.setIgnoreErrors(false); environment.setIgnoreErrors(false);
environment.setErrorStream(errStream); environment.setErrorStream(errStream);
environment.setStubs(arguments.stubs);
// install any compiler plugins // install any compiler plugins
List<CompilerPlugin> plugins = arguments.getCompilerPlugins(); List<CompilerPlugin> plugins = arguments.getCompilerPlugins();
if (plugins != null) { if (plugins != null) {
@@ -37,6 +37,7 @@ import org.jetbrains.jet.lang.resolve.FqName;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.plugin.JetLanguage; import org.jetbrains.jet.plugin.JetLanguage;
import org.jetbrains.jet.plugin.JetMainDetector; import org.jetbrains.jet.plugin.JetMainDetector;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import org.jetbrains.jet.utils.PathUtil; import org.jetbrains.jet.utils.PathUtil;
import java.io.*; import java.io.*;
@@ -62,11 +63,11 @@ public class CompileEnvironment {
private URL stdlibUrl; private URL stdlibUrl;
private boolean ignoreErrors = false; private boolean ignoreErrors = false;
private boolean stubs = false; private final CompilerSpecialMode mode;
private final boolean verbose; private final boolean verbose;
public CompileEnvironment() { public CompileEnvironment() {
this(MessageRenderer.PLAIN, false); this(MessageRenderer.PLAIN, false, CompilerSpecialMode.REGULAR);
} }
/** /**
@@ -76,14 +77,15 @@ public class CompileEnvironment {
* @param messageRenderer * @param messageRenderer
* @param verbose * @param verbose
*/ */
public CompileEnvironment(MessageRenderer messageRenderer, boolean verbose) { public CompileEnvironment(MessageRenderer messageRenderer, boolean verbose, CompilerSpecialMode mode) {
this.mode = mode;
this.verbose = verbose; this.verbose = verbose;
rootDisposable = new Disposable() { rootDisposable = new Disposable() {
@Override @Override
public void dispose() { public void dispose() {
} }
}; };
environment = new JetCoreEnvironment(rootDisposable); environment = new JetCoreEnvironment(rootDisposable, mode == CompilerSpecialMode.REGULAR);
this.messageRenderer = messageRenderer; this.messageRenderer = messageRenderer;
} }
@@ -95,10 +97,6 @@ public class CompileEnvironment {
this.ignoreErrors = ignoreErrors; this.ignoreErrors = ignoreErrors;
} }
public void setStubs(boolean stubs) {
this.stubs = stubs;
}
public void dispose() { public void dispose() {
Disposer.dispose(rootDisposable); Disposer.dispose(rootDisposable);
} }
@@ -123,17 +121,24 @@ public class CompileEnvironment {
} }
public void ensureRuntime() { public void ensureRuntime() {
ensureRuntime(environment); if (mode == CompilerSpecialMode.REGULAR) {
ensureRuntime(environment);
} else if (mode == CompilerSpecialMode.JDK_HEADERS) {
ensureJdkRuntime(environment);
} else if (mode == CompilerSpecialMode.BUILTINS) {
// nop
} else {
throw new IllegalStateException("unknown mode: " + mode);
}
} }
public static void ensureRuntime(@NotNull JetCoreEnvironment env) { public static void ensureRuntime(@NotNull JetCoreEnvironment env) {
Project project = env.getProject(); ensureJdkRuntime(env);
if (JavaPsiFacade.getInstance(project).findClass("java.lang.Object", GlobalSearchScope.allScope(project)) == null) { ensureKotlinRuntime(env);
// TODO: prepend }
env.addToClasspath(findRtJar());
}
if (JavaPsiFacade.getInstance(project).findClass("jet.JetObject", GlobalSearchScope.allScope(project)) == null) { private static void ensureKotlinRuntime(JetCoreEnvironment env) {
if (JavaPsiFacade.getInstance(env.getProject()).findClass("jet.JetObject", GlobalSearchScope.allScope(env.getProject())) == null) {
// TODO: prepend // TODO: prepend
File kotlin = PathUtil.getDefaultRuntimePath(); File kotlin = PathUtil.getDefaultRuntimePath();
if (kotlin == null || !kotlin.exists()) { if (kotlin == null || !kotlin.exists()) {
@@ -147,6 +152,13 @@ public class CompileEnvironment {
} }
} }
public static void ensureJdkRuntime(JetCoreEnvironment env) {
if (JavaPsiFacade.getInstance(env.getProject()).findClass("java.lang.Object", GlobalSearchScope.allScope(env.getProject())) == null) {
// TODO: prepend
env.addToClasspath(findRtJar());
}
}
public static File findRtJar() { public static File findRtJar() {
String javaHome = System.getProperty("java.home"); String javaHome = System.getProperty("java.home");
if ("jre".equals(new File(javaHome).getName())) { if ("jre".equals(new File(javaHome).getName())) {
@@ -220,7 +232,7 @@ public class CompileEnvironment {
} }
private CompileEnvironment copyEnvironment(boolean verbose) { private CompileEnvironment copyEnvironment(boolean verbose) {
CompileEnvironment compileEnvironment = new CompileEnvironment(messageRenderer, verbose); CompileEnvironment compileEnvironment = new CompileEnvironment(messageRenderer, verbose, mode);
compileEnvironment.setIgnoreErrors(ignoreErrors); compileEnvironment.setIgnoreErrors(ignoreErrors);
compileEnvironment.setErrorStream(errorStream); compileEnvironment.setErrorStream(errorStream);
// copy across any compiler plugins // copy across any compiler plugins
@@ -268,7 +280,7 @@ public class CompileEnvironment {
public ClassFileFactory compileModule(Module moduleBuilder, String directory) { public ClassFileFactory compileModule(Module moduleBuilder, String directory) {
CompileSession moduleCompileSession = newCompileSession(); CompileSession moduleCompileSession = newCompileSession();
moduleCompileSession.setStubs(stubs); moduleCompileSession.setStubs(mode != CompilerSpecialMode.REGULAR);
if (moduleBuilder.getSourceFiles().isEmpty()) { if (moduleBuilder.getSourceFiles().isEmpty()) {
throw new CompileEnvironmentException("No source files where defined"); throw new CompileEnvironmentException("No source files where defined");
@@ -389,7 +401,7 @@ public class CompileEnvironment {
public boolean compileBunchOfSources(String sourceFileOrDir, String jar, String outputDir, boolean includeRuntime) { public boolean compileBunchOfSources(String sourceFileOrDir, String jar, String outputDir, boolean includeRuntime) {
CompileSession session = newCompileSession(); CompileSession session = newCompileSession();
session.setStubs(stubs); session.setStubs(mode != CompilerSpecialMode.REGULAR);
session.addSources(sourceFileOrDir); session.addSources(sourceFileOrDir);
@@ -426,7 +438,7 @@ public class CompileEnvironment {
} }
private CompileSession newCompileSession() { private CompileSession newCompileSession() {
CompileSession answer = new CompileSession(environment, messageRenderer, errorStream, verbose); CompileSession answer = new CompileSession(environment, messageRenderer, errorStream, verbose, mode);
environment.setSession(answer); environment.setSession(answer);
return answer; return answer;
} }
@@ -43,6 +43,7 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.AnalyzeExhaust; import org.jetbrains.jet.lang.resolve.java.AnalyzeExhaust;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.plugin.JetFileType; import org.jetbrains.jet.plugin.JetFileType;
import org.jetbrains.jet.utils.Progress; import org.jetbrains.jet.utils.Progress;
@@ -67,13 +68,15 @@ public class CompileSession {
private final MessageRenderer messageRenderer; private final MessageRenderer messageRenderer;
private final PrintStream errorStream; private final PrintStream errorStream;
private final boolean isVerbose; private final boolean isVerbose;
private final CompilerSpecialMode compilerSpecialMode;
private AnalyzeExhaust bindingContext; private AnalyzeExhaust bindingContext;
public CompileSession(JetCoreEnvironment environment, MessageRenderer messageRenderer, PrintStream errorStream, boolean verbose) { public CompileSession(JetCoreEnvironment environment, MessageRenderer messageRenderer, PrintStream errorStream, boolean verbose, CompilerSpecialMode mode) {
this.environment = environment; this.environment = environment;
this.messageRenderer = messageRenderer; this.messageRenderer = messageRenderer;
this.errorStream = errorStream; this.errorStream = errorStream;
isVerbose = verbose; isVerbose = verbose;
this.compilerSpecialMode = mode;
messageCollector = new MessageCollector(this.messageRenderer); messageCollector = new MessageCollector(this.messageRenderer);
} }
@@ -173,7 +176,7 @@ public class CompileSession {
Predicate<PsiFile> filesToAnalyzeCompletely = Predicate<PsiFile> filesToAnalyzeCompletely =
stubs ? Predicates.<PsiFile>alwaysFalse() : Predicates.<PsiFile>alwaysTrue(); stubs ? Predicates.<PsiFile>alwaysFalse() : Predicates.<PsiFile>alwaysTrue();
bindingContext = AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( bindingContext = AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
environment.getProject(), sourceFiles, filesToAnalyzeCompletely, JetControlFlowDataTraceFactory.EMPTY); environment.getProject(), sourceFiles, filesToAnalyzeCompletely, JetControlFlowDataTraceFactory.EMPTY, compilerSpecialMode);
for (Diagnostic diagnostic : bindingContext.getBindingContext().getDiagnostics()) { for (Diagnostic diagnostic : bindingContext.getBindingContext().getDiagnostics()) {
reportDiagnostic(messageCollector, diagnostic); reportDiagnostic(messageCollector, diagnostic);
@@ -43,7 +43,7 @@ public class JetCoreEnvironment extends JavaCoreEnvironment {
private List<CompilerPlugin> compilerPlugins = new ArrayList<CompilerPlugin>(); private List<CompilerPlugin> compilerPlugins = new ArrayList<CompilerPlugin>();
private CompileSession session; private CompileSession session;
public JetCoreEnvironment(Disposable parentDisposable) { public JetCoreEnvironment(Disposable parentDisposable, boolean includeJdkHeaders) {
super(parentDisposable); super(parentDisposable);
registerFileType(JetFileType.INSTANCE, "kt"); registerFileType(JetFileType.INSTANCE, "kt");
registerFileType(JetFileType.INSTANCE, "kts"); registerFileType(JetFileType.INSTANCE, "kts");
@@ -58,8 +58,10 @@ public class JetCoreEnvironment extends JavaCoreEnvironment {
.getExtensionPoint(PsiElementFinder.EP_NAME) .getExtensionPoint(PsiElementFinder.EP_NAME)
.registerExtension(new JavaElementFinder(myProject)); .registerExtension(new JavaElementFinder(myProject));
for (VirtualFile root : PathUtil.getAltHeadersRoots()) { if (includeJdkHeaders) {
addLibraryRoot(root); for (VirtualFile root : PathUtil.getAltHeadersRoots()) {
addLibraryRoot(root);
}
} }
JetStandardLibrary.initialize(getProject()); JetStandardLibrary.initialize(getProject());
@@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration; import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinderForJvm; import org.jetbrains.jet.lang.resolve.java.PsiClassFinderForJvm;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer; import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer;
import org.jetbrains.jet.lang.resolve.NamespaceFactoryImpl; import org.jetbrains.jet.lang.resolve.NamespaceFactoryImpl;
@@ -47,6 +48,7 @@ public class InjectorForJavaSemanticServices {
JavaBridgeConfiguration javaBridgeConfiguration = new JavaBridgeConfiguration(); JavaBridgeConfiguration javaBridgeConfiguration = new JavaBridgeConfiguration();
this.psiClassFinderForJvm = new PsiClassFinderForJvm(); this.psiClassFinderForJvm = new PsiClassFinderForJvm();
ModuleDescriptor moduleDescriptor = new org.jetbrains.jet.lang.descriptors.ModuleDescriptor("<dummy>"); ModuleDescriptor moduleDescriptor = new org.jetbrains.jet.lang.descriptors.ModuleDescriptor("<dummy>");
CompilerSpecialMode compilerSpecialMode = CompilerSpecialMode.REGULAR;
this.project = project; this.project = project;
JavaTypeTransformer javaTypeTransformer = new JavaTypeTransformer(); JavaTypeTransformer javaTypeTransformer = new JavaTypeTransformer();
NamespaceFactoryImpl namespaceFactoryImpl = new NamespaceFactoryImpl(); NamespaceFactoryImpl namespaceFactoryImpl = new NamespaceFactoryImpl();
@@ -63,6 +65,7 @@ public class InjectorForJavaSemanticServices {
this.javaDescriptorResolver.setTrace(bindingTrace); this.javaDescriptorResolver.setTrace(bindingTrace);
javaBridgeConfiguration.setJavaSemanticServices(javaSemanticServices); javaBridgeConfiguration.setJavaSemanticServices(javaSemanticServices);
javaBridgeConfiguration.setMode(compilerSpecialMode);
javaBridgeConfiguration.setProject(project); javaBridgeConfiguration.setProject(project);
this.psiClassFinderForJvm.setProject(project); this.psiClassFinderForJvm.setProject(project);
@@ -74,6 +77,8 @@ public class InjectorForJavaSemanticServices {
namespaceFactoryImpl.setModuleDescriptor(moduleDescriptor); namespaceFactoryImpl.setModuleDescriptor(moduleDescriptor);
namespaceFactoryImpl.setTrace(bindingTrace); namespaceFactoryImpl.setTrace(bindingTrace);
javaBridgeConfiguration.init();
psiClassFinderForJvm.initialize(); psiClassFinderForJvm.initialize();
} }
@@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
import org.jetbrains.jet.lang.resolve.ObservableBindingTrace; import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration; import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinderForJvm; import org.jetbrains.jet.lang.resolve.java.PsiClassFinderForJvm;
import org.jetbrains.jet.lang.resolve.DeclarationResolver; import org.jetbrains.jet.lang.resolve.DeclarationResolver;
@@ -51,6 +52,7 @@ import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
import org.jetbrains.jet.lang.resolve.ObservableBindingTrace; import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/* This file is generated by org.jetbrains.jet.di.AllInjectorsGenerator. DO NOT EDIT! */ /* This file is generated by org.jetbrains.jet.di.AllInjectorsGenerator. DO NOT EDIT! */
@@ -72,7 +74,8 @@ public class InjectorForTopDownAnalyzerForJvm {
@NotNull TopDownAnalysisParameters topDownAnalysisParameters, @NotNull TopDownAnalysisParameters topDownAnalysisParameters,
@NotNull ObservableBindingTrace observableBindingTrace, @NotNull ObservableBindingTrace observableBindingTrace,
@NotNull ModuleDescriptor moduleDescriptor, @NotNull ModuleDescriptor moduleDescriptor,
JetControlFlowDataTraceFactory jetControlFlowDataTraceFactory JetControlFlowDataTraceFactory jetControlFlowDataTraceFactory,
@NotNull CompilerSpecialMode compilerSpecialMode
) { ) {
this.topDownAnalyzer = new TopDownAnalyzer(); this.topDownAnalyzer = new TopDownAnalyzer();
this.topDownAnalysisContext = new TopDownAnalysisContext(); this.topDownAnalysisContext = new TopDownAnalysisContext();
@@ -138,6 +141,7 @@ public class InjectorForTopDownAnalyzerForJvm {
this.descriptorResolver.setTypeResolver(typeResolver); this.descriptorResolver.setTypeResolver(typeResolver);
this.javaBridgeConfiguration.setJavaSemanticServices(javaSemanticServices); this.javaBridgeConfiguration.setJavaSemanticServices(javaSemanticServices);
this.javaBridgeConfiguration.setMode(compilerSpecialMode);
this.javaBridgeConfiguration.setProject(project); this.javaBridgeConfiguration.setProject(project);
psiClassFinderForJvm.setProject(project); psiClassFinderForJvm.setProject(project);
@@ -204,6 +208,8 @@ public class InjectorForTopDownAnalyzerForJvm {
javaTypeTransformer.setJavaSemanticServices(javaSemanticServices); javaTypeTransformer.setJavaSemanticServices(javaSemanticServices);
javaTypeTransformer.setResolver(javaDescriptorResolver); javaTypeTransformer.setResolver(javaDescriptorResolver);
javaBridgeConfiguration.init();
psiClassFinderForJvm.initialize(); psiClassFinderForJvm.initialize();
} }
@@ -84,7 +84,8 @@ public class AnalyzerFacadeForJVM {
file.getProject(), file.getProject(),
declarationProvider.fun(file), declarationProvider.fun(file),
Predicates.<PsiFile>equalTo(file), Predicates.<PsiFile>equalTo(file),
JetControlFlowDataTraceFactory.EMPTY); JetControlFlowDataTraceFactory.EMPTY,
CompilerSpecialMode.REGULAR);
return new Result<AnalyzeExhaust>(bindingContext, PsiModificationTracker.MODIFICATION_COUNT); return new Result<AnalyzeExhaust>(bindingContext, PsiModificationTracker.MODIFICATION_COUNT);
} }
catch (ProcessCanceledException e) { catch (ProcessCanceledException e) {
@@ -123,7 +124,8 @@ public class AnalyzerFacadeForJVM {
project, project,
files, files,
Predicates.<PsiFile>alwaysFalse(), Predicates.<PsiFile>alwaysFalse(),
JetControlFlowDataTraceFactory.EMPTY); JetControlFlowDataTraceFactory.EMPTY,
CompilerSpecialMode.REGULAR);
return new Result<AnalyzeExhaust>(analyzeExhaust, PsiModificationTracker.MODIFICATION_COUNT); return new Result<AnalyzeExhaust>(analyzeExhaust, PsiModificationTracker.MODIFICATION_COUNT);
} }
catch (ProcessCanceledException e) { catch (ProcessCanceledException e) {
@@ -156,12 +158,14 @@ public class AnalyzerFacadeForJVM {
} }
public static AnalyzeExhaust analyzeOneFileWithJavaIntegration(JetFile file, JetControlFlowDataTraceFactory flowDataTraceFactory) { public static AnalyzeExhaust analyzeOneFileWithJavaIntegration(JetFile file, JetControlFlowDataTraceFactory flowDataTraceFactory) {
return analyzeFilesWithJavaIntegration(file.getProject(), Collections.singleton(file), Predicates.<PsiFile>alwaysTrue(), flowDataTraceFactory); return analyzeFilesWithJavaIntegration(file.getProject(), Collections.singleton(file),
Predicates.<PsiFile>alwaysTrue(), flowDataTraceFactory, CompilerSpecialMode.REGULAR);
} }
public static AnalyzeExhaust analyzeFilesWithJavaIntegration( public static AnalyzeExhaust analyzeFilesWithJavaIntegration(
Project project, Collection<JetFile> files, Predicate<PsiFile> filesToAnalyzeCompletely, Project project, Collection<JetFile> files, Predicate<PsiFile> filesToAnalyzeCompletely,
JetControlFlowDataTraceFactory flowDataTraceFactory) { JetControlFlowDataTraceFactory flowDataTraceFactory,
CompilerSpecialMode compilerSpecialMode) {
BindingTraceContext bindingTraceContext = new BindingTraceContext(); BindingTraceContext bindingTraceContext = new BindingTraceContext();
final ModuleDescriptor owner = new ModuleDescriptor("<module>"); final ModuleDescriptor owner = new ModuleDescriptor("<module>");
@@ -172,7 +176,8 @@ public class AnalyzerFacadeForJVM {
InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm( InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(
project, topDownAnalysisParameters, project, topDownAnalysisParameters,
new ObservableBindingTrace(bindingTraceContext), owner, flowDataTraceFactory); new ObservableBindingTrace(bindingTraceContext), owner, flowDataTraceFactory,
compilerSpecialMode);
injector.getTopDownAnalyzer().analyzeFiles(files); injector.getTopDownAnalyzer().analyzeFiles(files);
@@ -184,6 +189,7 @@ public class AnalyzerFacadeForJVM {
Project project = files.iterator().next().getProject(); Project project = files.iterator().next().getProject();
return analyzeFilesWithJavaIntegration(project, files, Predicates.<PsiFile>alwaysFalse(), JetControlFlowDataTraceFactory.EMPTY); return analyzeFilesWithJavaIntegration(project, files, Predicates.<PsiFile>alwaysFalse(),
JetControlFlowDataTraceFactory.EMPTY, CompilerSpecialMode.REGULAR);
} }
} }
@@ -0,0 +1,26 @@
/*
* 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.lang.resolve.java;
/**
* @author Stepan Koltsov
*/
public enum CompilerSpecialMode {
REGULAR,
BUILTINS,
JDK_HEADERS,
}
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.resolve.FqName;
import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.ImportPath;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -48,11 +49,12 @@ public class JavaBridgeConfiguration implements ModuleConfiguration {
private JavaSemanticServices javaSemanticServices; private JavaSemanticServices javaSemanticServices;
@NotNull @NotNull
private ModuleConfiguration delegateConfiguration; private ModuleConfiguration delegateConfiguration;
@NotNull
private CompilerSpecialMode mode;
@Inject @Inject
public void setProject(@NotNull Project project) { public void setProject(@NotNull Project project) {
this.project = project; this.project = project;
this.delegateConfiguration = DefaultModuleConfiguration.createStandardConfiguration(project);
} }
@Inject @Inject
@@ -60,6 +62,16 @@ public class JavaBridgeConfiguration implements ModuleConfiguration {
this.javaSemanticServices = javaSemanticServices; this.javaSemanticServices = javaSemanticServices;
} }
@Inject
public void setMode(@NotNull CompilerSpecialMode mode) {
this.mode = mode;
}
@PostConstruct
public void init() {
this.delegateConfiguration = DefaultModuleConfiguration.createStandardConfiguration(project, mode == CompilerSpecialMode.BUILTINS);
}
@Override @Override
@@ -38,14 +38,16 @@ public class DefaultModuleConfiguration implements ModuleConfiguration {
public static final ImportPath[] DEFAULT_JET_IMPORTS = new ImportPath[] { public static final ImportPath[] DEFAULT_JET_IMPORTS = new ImportPath[] {
new ImportPath("kotlin.*"), new ImportPath("kotlin.io.*"), new ImportPath("jet.*"), }; new ImportPath("kotlin.*"), new ImportPath("kotlin.io.*"), new ImportPath("jet.*"), };
private Project project; private final Project project;
private final boolean extendBuiltins;
public static DefaultModuleConfiguration createStandardConfiguration(Project project) { public static DefaultModuleConfiguration createStandardConfiguration(Project project, boolean extendBuiltins) {
return new DefaultModuleConfiguration(project); return new DefaultModuleConfiguration(project, extendBuiltins);
} }
private DefaultModuleConfiguration(Project project) { private DefaultModuleConfiguration(@NotNull Project project, boolean extendBuiltins) {
this.project = project; this.project = project;
this.extendBuiltins = extendBuiltins;
} }
@Override @Override
@@ -58,7 +60,12 @@ public class DefaultModuleConfiguration implements ModuleConfiguration {
@Override @Override
public void extendNamespaceScope(@NotNull BindingTrace trace, @NotNull NamespaceDescriptor namespaceDescriptor, @NotNull WritableScope namespaceMemberScope) { public void extendNamespaceScope(@NotNull BindingTrace trace, @NotNull NamespaceDescriptor namespaceDescriptor, @NotNull WritableScope namespaceMemberScope) {
if (DescriptorUtils.getFQName(namespaceDescriptor).equals(JetStandardClasses.STANDARD_CLASSES_FQNAME.toUnsafe())) { if (DescriptorUtils.getFQName(namespaceDescriptor).equals(JetStandardClasses.STANDARD_CLASSES_FQNAME.toUnsafe())) {
namespaceMemberScope.importScope(JetStandardLibrary.getInstance().getLibraryScope()); if (!extendBuiltins) {
namespaceMemberScope.importScope(JetStandardClasses.STANDARD_CLASSES);
} else {
namespaceMemberScope.importScope(JetStandardLibrary.getInstance().getLibraryScope());
}
} }
} }
} }
@@ -235,7 +235,7 @@ public class JetStandardClasses {
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@NotNull @NotNull
/*package*/ static final JetScope STANDARD_CLASSES; public static final JetScope STANDARD_CLASSES;
static { static {
WritableScope writableScope = new WritableScopeImpl(JetScope.EMPTY, STANDARD_CLASSES_NAMESPACE, RedeclarationHandler.DO_NOTHING).setDebugName("JetStandardClasses.STANDARD_CLASSES"); WritableScope writableScope = new WritableScopeImpl(JetScope.EMPTY, STANDARD_CLASSES_NAMESPACE, RedeclarationHandler.DO_NOTHING).setDebugName("JetStandardClasses.STANDARD_CLASSES");
@@ -27,7 +27,7 @@ public class CompileBuiltinsTest extends TestCaseWithTmpdirIndependentFromIdea {
@Test @Test
public void compile() { public void compile() {
KotlinCompiler.ExitCode exitCode = new KotlinCompiler().exec( KotlinCompiler.ExitCode exitCode = new KotlinCompiler().exec(
System.err, "-output", tmpdir.getPath(), "-src", "./compiler/frontend/src", "-stubs"); System.err, "-output", tmpdir.getPath(), "-src", "./compiler/frontend/src", "-mode", "builtins");
if (exitCode != KotlinCompiler.ExitCode.OK) { if (exitCode != KotlinCompiler.ExitCode.OK) {
throw new IllegalStateException("jdk headers compilation failed: " + exitCode); throw new IllegalStateException("jdk headers compilation failed: " + exitCode);
} }
@@ -27,7 +27,7 @@ public class CompileJdkHeadersTest extends TestCaseWithTmpdirIndependentFromIdea
@Test @Test
public void compile() { public void compile() {
KotlinCompiler.ExitCode exitCode = new KotlinCompiler().exec( KotlinCompiler.ExitCode exitCode = new KotlinCompiler().exec(
System.err, "-output", tmpdir.getPath(), "-src", "./jdk-headers/src", "-stubs"); System.err, "-output", tmpdir.getPath(), "-src", "./jdk-headers/src", "-mode", "jdkHeaders");
if (exitCode != KotlinCompiler.ExitCode.OK) { if (exitCode != KotlinCompiler.ExitCode.OK) {
throw new IllegalStateException("jdk headers compilation failed: " + exitCode); throw new IllegalStateException("jdk headers compilation failed: " + exitCode);
} }
@@ -74,7 +74,7 @@ public abstract class JetLiteFixture extends UsefulTestCase {
} }
protected void createEnvironmentWithFullJdk() { protected void createEnvironmentWithFullJdk() {
myEnvironment = new JetCoreEnvironment(getTestRootDisposable()); myEnvironment = new JetCoreEnvironment(getTestRootDisposable(), true);
final File rtJar = CompileEnvironment.findRtJar(); final File rtJar = CompileEnvironment.findRtJar();
myEnvironment.addToClasspath(rtJar); myEnvironment.addToClasspath(rtJar);
} }
@@ -162,7 +162,7 @@ public class JetTestUtils {
public static JetCoreEnvironment createEnvironmentWithMockJdk(Disposable disposable) { public static JetCoreEnvironment createEnvironmentWithMockJdk(Disposable disposable) {
JetCoreEnvironment environment = new JetCoreEnvironment(disposable); JetCoreEnvironment environment = new JetCoreEnvironment(disposable, true);
final File rtJar = new File(JetTestCaseBuilder.getHomeDirectory(), "compiler/testData/mockJDK-1.7/jre/lib/rt.jar"); final File rtJar = new File(JetTestCaseBuilder.getHomeDirectory(), "compiler/testData/mockJDK-1.7/jre/lib/rt.jar");
environment.addToClasspath(rtJar); environment.addToClasspath(rtJar);
environment.addToClasspath(getAnnotationsJar()); environment.addToClasspath(getAnnotationsJar());
@@ -37,6 +37,7 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import java.io.File; import java.io.File;
import java.nio.charset.Charset; import java.nio.charset.Charset;
@@ -166,7 +167,7 @@ public class JetDiagnosticsTest extends JetLiteFixture {
} }
BindingContext bindingContext = AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( BindingContext bindingContext = AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
getProject(), jetFiles, Predicates.<PsiFile>alwaysTrue(), JetControlFlowDataTraceFactory.EMPTY) getProject(), jetFiles, Predicates.<PsiFile>alwaysTrue(), JetControlFlowDataTraceFactory.EMPTY, CompilerSpecialMode.REGULAR)
.getBindingContext(); .getBindingContext();
boolean ok = true; boolean ok = true;
@@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.parsing.JetParsingTest; import org.jetbrains.jet.parsing.JetParsingTest;
@@ -69,7 +70,7 @@ public class TestlibTest extends CodegenTestCase {
private TestSuite doBuildSuite() { private TestSuite doBuildSuite() {
try { try {
CompileSession session = new CompileSession(myEnvironment, MessageRenderer.PLAIN, System.err, false); CompileSession session = new CompileSession(myEnvironment, MessageRenderer.PLAIN, System.err, false, CompilerSpecialMode.REGULAR);
myEnvironment.addToClasspath(ForTestCompileStdlib.stdlibJarForTests()); myEnvironment.addToClasspath(ForTestCompileStdlib.stdlibJarForTests());
@@ -33,6 +33,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.java.AnalyzeExhaust; import org.jetbrains.jet.lang.resolve.java.AnalyzeExhaust;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -137,7 +138,8 @@ public abstract class ExpectedResolveData {
Project project = files.iterator().next().getProject(); Project project = files.iterator().next().getProject();
JetStandardLibrary lib = JetStandardLibrary.getInstance(); JetStandardLibrary lib = JetStandardLibrary.getInstance();
AnalyzeExhaust analyzeExhaust = AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(project, files, Predicates.<PsiFile>alwaysTrue(), JetControlFlowDataTraceFactory.EMPTY); AnalyzeExhaust analyzeExhaust = AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(project, files,
Predicates.<PsiFile>alwaysTrue(), JetControlFlowDataTraceFactory.EMPTY, CompilerSpecialMode.REGULAR);
BindingContext bindingContext = analyzeExhaust.getBindingContext(); BindingContext bindingContext = analyzeExhaust.getBindingContext();
for (Diagnostic diagnostic : bindingContext.getDiagnostics()) { for (Diagnostic diagnostic : bindingContext.getDiagnostics()) {
if (diagnostic instanceof UnresolvedReferenceDiagnostic) { if (diagnostic instanceof UnresolvedReferenceDiagnostic) {
@@ -28,10 +28,7 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.calls.CallResolver; import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration; import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinderForJvm;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
@@ -72,6 +69,7 @@ public class AllInjectorsGenerator {
private static void generateInjectorForTopDownAnalyzerForJvm() throws IOException { private static void generateInjectorForTopDownAnalyzerForJvm() throws IOException {
DependencyInjectorGenerator generator = new DependencyInjectorGenerator(false); DependencyInjectorGenerator generator = new DependencyInjectorGenerator(false);
generateInjectorForTopDownAnalyzerCommon(generator); generateInjectorForTopDownAnalyzerCommon(generator);
generator.addParameter(CompilerSpecialMode.class);
generator.addPublicField(JavaBridgeConfiguration.class); generator.addPublicField(JavaBridgeConfiguration.class);
generator.addField(PsiClassFinderForJvm.class); generator.addField(PsiClassFinderForJvm.class);
generator.generate("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJvm"); generator.generate("compiler/frontend.java/src", "org.jetbrains.jet.di", "InjectorForTopDownAnalyzerForJvm");
@@ -134,6 +132,8 @@ public class AllInjectorsGenerator {
generator.addPublicField(PsiClassFinderForJvm.class); generator.addPublicField(PsiClassFinderForJvm.class);
generator.addField(false, ModuleDescriptor.class, null, generator.addField(false, ModuleDescriptor.class, null,
new GivenExpression("new org.jetbrains.jet.lang.descriptors.ModuleDescriptor(\"<dummy>\")")); new GivenExpression("new org.jetbrains.jet.lang.descriptors.ModuleDescriptor(\"<dummy>\")"));
generator.addField(false, CompilerSpecialMode.class, null,
new GivenExpression("CompilerSpecialMode.REGULAR"));
// Parameters // Parameters
generator.addPublicParameter(Project.class); generator.addPublicParameter(Project.class);
@@ -142,7 +142,7 @@ public final class AnalyzerFacadeForJS {
@Override @Override
public void extendNamespaceScope(@NotNull BindingTrace trace, @NotNull NamespaceDescriptor namespaceDescriptor, public void extendNamespaceScope(@NotNull BindingTrace trace, @NotNull NamespaceDescriptor namespaceDescriptor,
@NotNull WritableScope namespaceMemberScope) { @NotNull WritableScope namespaceMemberScope) {
DefaultModuleConfiguration.createStandardConfiguration(project).extendNamespaceScope(trace, namespaceDescriptor, namespaceMemberScope); DefaultModuleConfiguration.createStandardConfiguration(project, true).extendNamespaceScope(trace, namespaceDescriptor, namespaceMemberScope);
} }
} }