diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.java b/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.java index 4b0e4dadc64..f8a623aa857 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/analyze/TopDownAnalyzerFacadeForJS.java @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor; import org.jetbrains.kotlin.descriptors.PackageFragmentProvider; import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl; import org.jetbrains.kotlin.di.InjectorForTopDownAnalyzerForJs; +import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult; import org.jetbrains.kotlin.js.config.Config; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap; @@ -61,7 +62,7 @@ public final class TopDownAnalyzerFacadeForJS { //TODO: refactor @NotNull - public static AnalysisResult analyzeFiles( + public static JsAnalysisResult analyzeFiles( @NotNull Collection files, @NotNull Predicate filesToAnalyzeCompletely, @NotNull Config config @@ -84,7 +85,7 @@ public final class TopDownAnalyzerFacadeForJS { } @NotNull - public static AnalysisResult analyzeFilesWithGivenTrace( + public static JsAnalysisResult analyzeFilesWithGivenTrace( @NotNull Collection files, @NotNull BindingTrace trace, @NotNull ModuleDescriptorImpl module, @@ -109,7 +110,7 @@ public final class TopDownAnalyzerFacadeForJS { try { injector.getLazyTopDownAnalyzerForTopLevel().analyzeFiles(topDownAnalysisParameters, allFiles, Collections.emptyList()); - return AnalysisResult.success(trace.getBindingContext(), module); + return JsAnalysisResult.success(trace, module); } finally { injector.destroy(); diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/analyzer/JsAnalysisResult.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/analyzer/JsAnalysisResult.kt new file mode 100644 index 00000000000..bd97068d04c --- /dev/null +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/analyzer/JsAnalysisResult.kt @@ -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) + } + } +} diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/config/Config.java b/js/js.frontend/src/org/jetbrains/kotlin/js/config/Config.java index a8146ec36f2..adab164e589 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/config/Config.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/config/Config.java @@ -49,9 +49,6 @@ public abstract class Config { private final boolean sourcemap; - @NotNull - private final BindingTrace trace = new BindingTraceContext(); - public Config( @NotNull Project project, @NotNull String moduleId, @@ -107,11 +104,6 @@ public abstract class Config { return null; } - @NotNull - public BindingTrace getTrace() { - return trace; - } - @Nullable public ModuleDescriptor getLibraryModule() { return null; diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/facade/K2JSTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/facade/K2JSTranslator.java index 6d459ce84cb..28bb460788e 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/facade/K2JSTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/facade/K2JSTranslator.java @@ -31,12 +31,12 @@ import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; 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.SimpleOutputFile; import org.jetbrains.kotlin.backend.common.output.SimpleOutputFileCollection; import org.jetbrains.kotlin.descriptors.ModuleDescriptor; 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.facade.exceptions.TranslationException; 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.translate.general.Translation; 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.utils.fileUtils.FileUtilsPackage; @@ -148,8 +148,12 @@ public final class K2JSTranslator { @Nullable SourceMapBuilder sourceMapBuilder, @NotNull Consumer astConsumer ) throws TranslationException { - JsProgram program = generateProgram(files, mainCallParameters); - Diagnostics diagnostics = config.getTrace().getBindingContext().getDiagnostics(); + JsAnalysisResult analysisResult = TopDownAnalyzerFacadeForJS.analyzeFiles(files, Predicates.alwaysTrue(), config); + 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(); @@ -160,17 +164,6 @@ public final class K2JSTranslator { return Status.success(output.toString()); } - @NotNull - public JsProgram generateProgram(@NotNull List filesToTranslate, - @NotNull MainCallParameters mainCallParameters) - throws TranslationException { - AnalysisResult analysisResult = TopDownAnalyzerFacadeForJS.analyzeFiles(filesToTranslate, Predicates.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 private Project getProject() { return config.getProject(); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index 20537a2f784..47fd6ee5401 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.resolve.BindingContext; +import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.calls.tasks.TasksPackage; import org.jetbrains.kotlin.types.reflect.ReflectionTypes; @@ -52,19 +53,19 @@ import static org.jetbrains.kotlin.resolve.DescriptorUtils.isExtension; */ 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"); Namer namer = Namer.newInstance(program.getRootScope()); Intrinsics intrinsics = new Intrinsics(); 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 private final JsProgram program; @NotNull - private final BindingContext bindingContext; + private final BindingTrace bindingTrace; @NotNull private final Namer namer; @@ -101,11 +102,11 @@ public final class StaticContext { private final EcmaVersion ecmaVersion; //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 StandardClasses standardClasses, @NotNull JsScope rootScope, @NotNull Config config, @NotNull ModuleDescriptor moduleDescriptor) { this.program = program; - this.bindingContext = bindingContext; + this.bindingTrace = bindingTrace; this.namer = namer; this.intrinsics = intrinsics; this.rootScope = rootScope; @@ -124,9 +125,14 @@ public final class StaticContext { return program; } + @NotNull + public BindingTrace getBindingTrace() { + return bindingTrace; + } + @NotNull public BindingContext getBindingContext() { - return bindingContext; + return bindingTrace.getBindingContext(); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index e7dee983f7f..4bd3d9fa4cb 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.js.translate.utils.TranslationUtils; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.psi.JetExpression; import org.jetbrains.kotlin.resolve.BindingContext; +import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.types.reflect.ReflectionTypes; import java.util.HashMap; @@ -165,7 +166,9 @@ public class TranslationContext { } @NotNull - public DiagnosticSink getTrace() { return staticContext.getConfig().getTrace(); } + public BindingTrace bindingTrace() { + return staticContext.getBindingTrace(); + } @NotNull public JsScope getScopeForDescriptor(@NotNull DeclarationDescriptor descriptor) { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java index db8de2e6060..5e301c67424 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.psi.JetExpression; import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.psi.JetNamedFunction; import org.jetbrains.kotlin.resolve.BindingContext; +import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilPackage; import java.util.Collection; @@ -161,13 +162,13 @@ public final class Translation { } @NotNull - public static JsProgram generateAst(@NotNull BindingContext bindingContext, + public static JsProgram generateAst(@NotNull BindingTrace bindingTrace, @NotNull Collection files, @NotNull MainCallParameters mainCallParameters, @NotNull ModuleDescriptor moduleDescriptor, @NotNull Config config) throws TranslationException { try { - return doGenerateAst(bindingContext, files, mainCallParameters, moduleDescriptor, config); + return doGenerateAst(bindingTrace, files, mainCallParameters, moduleDescriptor, config); } catch (UnsupportedOperationException e) { throw new UnsupportedFeatureException("Unsupported feature used.", e); @@ -178,11 +179,11 @@ public final class Translation { } @NotNull - private static JsProgram doGenerateAst(@NotNull BindingContext bindingContext, @NotNull Collection files, + private static JsProgram doGenerateAst(@NotNull BindingTrace bindingTrace, @NotNull Collection files, @NotNull MainCallParameters mainCallParameters, @NotNull ModuleDescriptor moduleDescriptor, @NotNull Config config) throws MainFunctionNotFoundException { - StaticContext staticContext = StaticContext.generateStaticContext(bindingContext, config, moduleDescriptor); + StaticContext staticContext = StaticContext.generateStaticContext(bindingTrace, config, moduleDescriptor); JsProgram program = staticContext.getProgram(); JsBlock block = program.getGlobalBlock();