JS: use one BindingTrace for translation

This commit is contained in:
Alexey Tsvetkov
2015-01-18 19:55:53 +03:00
parent baccfa914f
commit aa5f237154
7 changed files with 69 additions and 37 deletions
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor;
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider; import org.jetbrains.kotlin.descriptors.PackageFragmentProvider;
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl; import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl;
import org.jetbrains.kotlin.di.InjectorForTopDownAnalyzerForJs; import org.jetbrains.kotlin.di.InjectorForTopDownAnalyzerForJs;
import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult;
import org.jetbrains.kotlin.js.config.Config; import org.jetbrains.kotlin.js.config.Config;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap; import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap;
@@ -61,7 +62,7 @@ public final class TopDownAnalyzerFacadeForJS {
//TODO: refactor //TODO: refactor
@NotNull @NotNull
public static AnalysisResult analyzeFiles( public static JsAnalysisResult analyzeFiles(
@NotNull Collection<JetFile> files, @NotNull Collection<JetFile> files,
@NotNull Predicate<PsiFile> filesToAnalyzeCompletely, @NotNull Predicate<PsiFile> filesToAnalyzeCompletely,
@NotNull Config config @NotNull Config config
@@ -84,7 +85,7 @@ public final class TopDownAnalyzerFacadeForJS {
} }
@NotNull @NotNull
public static AnalysisResult analyzeFilesWithGivenTrace( public static JsAnalysisResult analyzeFilesWithGivenTrace(
@NotNull Collection<JetFile> files, @NotNull Collection<JetFile> files,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull ModuleDescriptorImpl module, @NotNull ModuleDescriptorImpl module,
@@ -109,7 +110,7 @@ public final class TopDownAnalyzerFacadeForJS {
try { try {
injector.getLazyTopDownAnalyzerForTopLevel().analyzeFiles(topDownAnalysisParameters, allFiles, injector.getLazyTopDownAnalyzerForTopLevel().analyzeFiles(topDownAnalysisParameters, allFiles,
Collections.<PackageFragmentProvider>emptyList()); Collections.<PackageFragmentProvider>emptyList());
return AnalysisResult.success(trace.getBindingContext(), module); return JsAnalysisResult.success(trace, module);
} }
finally { finally {
injector.destroy(); injector.destroy();
@@ -0,0 +1,36 @@
/*
* Copyright 2010-2015 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.kotlin.js.analyzer
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.types.ErrorUtils
import kotlin.platform.platformStatic
public class JsAnalysisResult(
public val bindingTrace: BindingTrace,
moduleDescriptor: ModuleDescriptor
) : AnalysisResult(bindingTrace.getBindingContext(), moduleDescriptor) {
class object {
platformStatic public fun success(trace: BindingTrace, module: ModuleDescriptor): JsAnalysisResult {
return JsAnalysisResult(trace, module)
}
}
}
@@ -49,9 +49,6 @@ public abstract class Config {
private final boolean sourcemap; private final boolean sourcemap;
@NotNull
private final BindingTrace trace = new BindingTraceContext();
public Config( public Config(
@NotNull Project project, @NotNull Project project,
@NotNull String moduleId, @NotNull String moduleId,
@@ -107,11 +104,6 @@ public abstract class Config {
return null; return null;
} }
@NotNull
public BindingTrace getTrace() {
return trace;
}
@Nullable @Nullable
public ModuleDescriptor getLibraryModule() { public ModuleDescriptor getLibraryModule() {
return null; return null;
@@ -31,12 +31,12 @@ import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.analyzer.AnalysisResult;
import org.jetbrains.kotlin.backend.common.output.OutputFileCollection; import org.jetbrains.kotlin.backend.common.output.OutputFileCollection;
import org.jetbrains.kotlin.backend.common.output.SimpleOutputFile; import org.jetbrains.kotlin.backend.common.output.SimpleOutputFile;
import org.jetbrains.kotlin.backend.common.output.SimpleOutputFileCollection; import org.jetbrains.kotlin.backend.common.output.SimpleOutputFileCollection;
import org.jetbrains.kotlin.descriptors.ModuleDescriptor; import org.jetbrains.kotlin.descriptors.ModuleDescriptor;
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS; import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS;
import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult;
import org.jetbrains.kotlin.js.config.Config; import org.jetbrains.kotlin.js.config.Config;
import org.jetbrains.kotlin.js.facade.exceptions.TranslationException; import org.jetbrains.kotlin.js.facade.exceptions.TranslationException;
import org.jetbrains.kotlin.js.inline.JsInliner; import org.jetbrains.kotlin.js.inline.JsInliner;
@@ -45,7 +45,7 @@ import org.jetbrains.kotlin.js.sourceMap.SourceMap3Builder;
import org.jetbrains.kotlin.js.sourceMap.SourceMapBuilder; import org.jetbrains.kotlin.js.sourceMap.SourceMapBuilder;
import org.jetbrains.kotlin.js.translate.general.Translation; import org.jetbrains.kotlin.js.translate.general.Translation;
import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics; import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics;
import org.jetbrains.kotlin.utils.fileUtils.FileUtilsPackage; import org.jetbrains.kotlin.utils.fileUtils.FileUtilsPackage;
@@ -148,8 +148,12 @@ public final class K2JSTranslator {
@Nullable SourceMapBuilder sourceMapBuilder, @Nullable SourceMapBuilder sourceMapBuilder,
@NotNull Consumer<JsNode> astConsumer @NotNull Consumer<JsNode> astConsumer
) throws TranslationException { ) throws TranslationException {
JsProgram program = generateProgram(files, mainCallParameters); JsAnalysisResult analysisResult = TopDownAnalyzerFacadeForJS.analyzeFiles(files, Predicates.<PsiFile>alwaysTrue(), config);
Diagnostics diagnostics = config.getTrace().getBindingContext().getDiagnostics(); BindingTrace bindingTrace = analysisResult.getBindingTrace();
TopDownAnalyzerFacadeForJS.checkForErrors(Config.withJsLibAdded(files, config), bindingTrace.getBindingContext());
ModuleDescriptor moduleDescriptor = analysisResult.getModuleDescriptor();
JsProgram program = Translation.generateAst(bindingTrace, files, mainCallParameters, moduleDescriptor, config);
Diagnostics diagnostics = bindingTrace.getBindingContext().getDiagnostics();
if (hasError(diagnostics)) return Status.fail(); if (hasError(diagnostics)) return Status.fail();
@@ -160,17 +164,6 @@ public final class K2JSTranslator {
return Status.success(output.toString()); return Status.success(output.toString());
} }
@NotNull
public JsProgram generateProgram(@NotNull List<JetFile> filesToTranslate,
@NotNull MainCallParameters mainCallParameters)
throws TranslationException {
AnalysisResult analysisResult = TopDownAnalyzerFacadeForJS.analyzeFiles(filesToTranslate, Predicates.<PsiFile>alwaysTrue(), config);
BindingContext bindingContext = analysisResult.getBindingContext();
TopDownAnalyzerFacadeForJS.checkForErrors(Config.withJsLibAdded(filesToTranslate, config), bindingContext);
ModuleDescriptor moduleDescriptor = analysisResult.getModuleDescriptor();
return Translation.generateAst(bindingContext, filesToTranslate, mainCallParameters, moduleDescriptor, config);
}
@NotNull @NotNull
private Project getProject() { private Project getProject() {
return config.getProject(); return config.getProject();
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics;
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.calls.tasks.TasksPackage; import org.jetbrains.kotlin.resolve.calls.tasks.TasksPackage;
import org.jetbrains.kotlin.types.reflect.ReflectionTypes; import org.jetbrains.kotlin.types.reflect.ReflectionTypes;
@@ -52,19 +53,19 @@ import static org.jetbrains.kotlin.resolve.DescriptorUtils.isExtension;
*/ */
public final class StaticContext { public final class StaticContext {
public static StaticContext generateStaticContext(@NotNull BindingContext bindingContext, @NotNull Config config, @NotNull ModuleDescriptor moduleDescriptor) { public static StaticContext generateStaticContext(@NotNull BindingTrace bindingTrace, @NotNull Config config, @NotNull ModuleDescriptor moduleDescriptor) {
JsProgram program = new JsProgram("main"); JsProgram program = new JsProgram("main");
Namer namer = Namer.newInstance(program.getRootScope()); Namer namer = Namer.newInstance(program.getRootScope());
Intrinsics intrinsics = new Intrinsics(); Intrinsics intrinsics = new Intrinsics();
StandardClasses standardClasses = StandardClasses.bindImplementations(namer.getKotlinScope()); StandardClasses standardClasses = StandardClasses.bindImplementations(namer.getKotlinScope());
return new StaticContext(program, bindingContext, namer, intrinsics, standardClasses, program.getRootScope(), config, moduleDescriptor); return new StaticContext(program, bindingTrace, namer, intrinsics, standardClasses, program.getRootScope(), config, moduleDescriptor);
} }
@NotNull @NotNull
private final JsProgram program; private final JsProgram program;
@NotNull @NotNull
private final BindingContext bindingContext; private final BindingTrace bindingTrace;
@NotNull @NotNull
private final Namer namer; private final Namer namer;
@@ -101,11 +102,11 @@ public final class StaticContext {
private final EcmaVersion ecmaVersion; private final EcmaVersion ecmaVersion;
//TODO: too many parameters in constructor //TODO: too many parameters in constructor
private StaticContext(@NotNull JsProgram program, @NotNull BindingContext bindingContext, private StaticContext(@NotNull JsProgram program, @NotNull BindingTrace bindingTrace,
@NotNull Namer namer, @NotNull Intrinsics intrinsics, @NotNull Namer namer, @NotNull Intrinsics intrinsics,
@NotNull StandardClasses standardClasses, @NotNull JsScope rootScope, @NotNull Config config, @NotNull ModuleDescriptor moduleDescriptor) { @NotNull StandardClasses standardClasses, @NotNull JsScope rootScope, @NotNull Config config, @NotNull ModuleDescriptor moduleDescriptor) {
this.program = program; this.program = program;
this.bindingContext = bindingContext; this.bindingTrace = bindingTrace;
this.namer = namer; this.namer = namer;
this.intrinsics = intrinsics; this.intrinsics = intrinsics;
this.rootScope = rootScope; this.rootScope = rootScope;
@@ -124,9 +125,14 @@ public final class StaticContext {
return program; return program;
} }
@NotNull
public BindingTrace getBindingTrace() {
return bindingTrace;
}
@NotNull @NotNull
public BindingContext getBindingContext() { public BindingContext getBindingContext() {
return bindingContext; return bindingTrace.getBindingContext();
} }
@NotNull @NotNull
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.js.translate.utils.TranslationUtils;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.JetExpression; import org.jetbrains.kotlin.psi.JetExpression;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.types.reflect.ReflectionTypes; import org.jetbrains.kotlin.types.reflect.ReflectionTypes;
import java.util.HashMap; import java.util.HashMap;
@@ -165,7 +166,9 @@ public class TranslationContext {
} }
@NotNull @NotNull
public DiagnosticSink getTrace() { return staticContext.getConfig().getTrace(); } public BindingTrace bindingTrace() {
return staticContext.getBindingTrace();
}
@NotNull @NotNull
public JsScope getScopeForDescriptor(@NotNull DeclarationDescriptor descriptor) { public JsScope getScopeForDescriptor(@NotNull DeclarationDescriptor descriptor) {
@@ -48,6 +48,7 @@ import org.jetbrains.kotlin.psi.JetExpression;
import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.psi.JetNamedFunction; import org.jetbrains.kotlin.psi.JetNamedFunction;
import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage; import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage;
import java.util.Collection; import java.util.Collection;
@@ -161,13 +162,13 @@ public final class Translation {
} }
@NotNull @NotNull
public static JsProgram generateAst(@NotNull BindingContext bindingContext, public static JsProgram generateAst(@NotNull BindingTrace bindingTrace,
@NotNull Collection<JetFile> files, @NotNull MainCallParameters mainCallParameters, @NotNull Collection<JetFile> files, @NotNull MainCallParameters mainCallParameters,
@NotNull ModuleDescriptor moduleDescriptor, @NotNull ModuleDescriptor moduleDescriptor,
@NotNull Config config) @NotNull Config config)
throws TranslationException { throws TranslationException {
try { try {
return doGenerateAst(bindingContext, files, mainCallParameters, moduleDescriptor, config); return doGenerateAst(bindingTrace, files, mainCallParameters, moduleDescriptor, config);
} }
catch (UnsupportedOperationException e) { catch (UnsupportedOperationException e) {
throw new UnsupportedFeatureException("Unsupported feature used.", e); throw new UnsupportedFeatureException("Unsupported feature used.", e);
@@ -178,11 +179,11 @@ public final class Translation {
} }
@NotNull @NotNull
private static JsProgram doGenerateAst(@NotNull BindingContext bindingContext, @NotNull Collection<JetFile> files, private static JsProgram doGenerateAst(@NotNull BindingTrace bindingTrace, @NotNull Collection<JetFile> files,
@NotNull MainCallParameters mainCallParameters, @NotNull MainCallParameters mainCallParameters,
@NotNull ModuleDescriptor moduleDescriptor, @NotNull ModuleDescriptor moduleDescriptor,
@NotNull Config config) throws MainFunctionNotFoundException { @NotNull Config config) throws MainFunctionNotFoundException {
StaticContext staticContext = StaticContext.generateStaticContext(bindingContext, config, moduleDescriptor); StaticContext staticContext = StaticContext.generateStaticContext(bindingTrace, config, moduleDescriptor);
JsProgram program = staticContext.getProgram(); JsProgram program = staticContext.getProgram();
JsBlock block = program.getGlobalBlock(); JsBlock block = program.getGlobalBlock();