JS: use one BindingTrace for translation
This commit is contained in:
@@ -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
|
||||||
|
|||||||
+4
-1
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user