001    /*
002     * Copyright 2010-2015 JetBrains s.r.o.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package org.jetbrains.kotlin.js.analyze;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.kotlin.config.LanguageVersion;
021    import org.jetbrains.kotlin.context.ContextKt;
022    import org.jetbrains.kotlin.context.ModuleContext;
023    import org.jetbrains.kotlin.context.MutableModuleContext;
024    import org.jetbrains.kotlin.descriptors.PackageFragmentProvider;
025    import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl;
026    import org.jetbrains.kotlin.frontend.js.di.InjectionKt;
027    import org.jetbrains.kotlin.js.analyzer.JsAnalysisResult;
028    import org.jetbrains.kotlin.js.config.JsConfig;
029    import org.jetbrains.kotlin.js.resolve.JsPlatform;
030    import org.jetbrains.kotlin.name.Name;
031    import org.jetbrains.kotlin.psi.KtFile;
032    import org.jetbrains.kotlin.resolve.*;
033    import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory;
034    import org.jetbrains.kotlin.serialization.js.JsModuleDescriptor;
035    
036    import java.util.ArrayList;
037    import java.util.Collection;
038    import java.util.Collections;
039    import java.util.List;
040    
041    public final class TopDownAnalyzerFacadeForJS {
042        private TopDownAnalyzerFacadeForJS() {
043        }
044    
045        @NotNull
046        public static JsAnalysisResult analyzeFiles(@NotNull Collection<KtFile> files, @NotNull JsConfig config) {
047            BindingTrace trace = new BindingTraceContext();
048    
049            MutableModuleContext newModuleContext = ContextKt.ContextForNewModule(
050                    config.getProject(), Name.special("<" + config.getModuleId() + ">"), JsPlatform.INSTANCE
051            );
052            newModuleContext.setDependencies(computeDependencies(newModuleContext.getModule(), config));
053            return analyzeFilesWithGivenTrace(files, trace, newModuleContext, config);
054        }
055    
056        @NotNull
057        private static List<ModuleDescriptorImpl> computeDependencies(ModuleDescriptorImpl module, @NotNull JsConfig config) {
058            List<ModuleDescriptorImpl> allDependencies = new ArrayList<ModuleDescriptorImpl>();
059            allDependencies.add(module);
060            for (JsModuleDescriptor<ModuleDescriptorImpl> descriptor : config.getModuleDescriptors()) {
061                allDependencies.add(descriptor.getData());
062            }
063            allDependencies.add(JsPlatform.INSTANCE.getBuiltIns().getBuiltInsModule());
064            return allDependencies;
065        }
066    
067        @NotNull
068        public static JsAnalysisResult analyzeFilesWithGivenTrace(
069                @NotNull Collection<KtFile> files,
070                @NotNull BindingTrace trace,
071                @NotNull ModuleContext moduleContext,
072                @NotNull JsConfig config
073        ) {
074            Collection<KtFile> allFiles = JsConfig.withJsLibAdded(files, config);
075    
076            LazyTopDownAnalyzerForTopLevel analyzerForJs = InjectionKt.createTopDownAnalyzerForJs(
077                    moduleContext, trace,
078                    new FileBasedDeclarationProviderFactory(moduleContext.getStorageManager(), allFiles),
079                    LanguageVersion.LATEST
080            );
081            analyzerForJs.analyzeFiles(TopDownAnalysisMode.TopLevelDeclarations, files, Collections.<PackageFragmentProvider>emptyList());
082            return JsAnalysisResult.success(trace, moduleContext.getModule());
083        }
084    
085        public static void checkForErrors(@NotNull Collection<KtFile> allFiles, @NotNull BindingContext bindingContext) {
086            AnalyzingUtils.throwExceptionOnErrors(bindingContext);
087            for (KtFile file : allFiles) {
088                AnalyzingUtils.checkForSyntacticErrors(file);
089            }
090        }
091    }